{"version":3,"file":"rapier.mjs","sources":["rapier_wasm3d.js","../../../gen3d/math.ts","../../../gen3d/dynamics/rigid_body.ts","../../../gen3d/geometry/feature.ts","../../../gen3d/geometry/shape.ts","../../../gen3d/control/pid_controller.ts","../../../gen3d/pipeline/event_queue.ts","../../../gen3d/pipeline/physics_hooks.ts","../../../gen3d/pipeline/query_pipeline.ts","../../../gen3d/geometry/collider.ts","../../../gen3d/dynamics/soft_body.ts","../../../gen3d/dynamics/impulse_joint.ts","../../../gen3d/dynamics/coefficient_combine_rule.ts","../../../gen3d/coarena.ts","../../../gen3d/dynamics/rigid_body_set.ts","../../../gen3d/geometry/ray.ts","../../../gen3d/geometry/point.ts","../../../gen3d/geometry/toi.ts","../../../gen3d/geometry/broad_phase.ts","../../../gen3d/geometry/narrow_phase.ts","../../../gen3d/geometry/contact.ts","../../../gen3d/pipeline/physics_pipeline.ts","../../../gen3d/pipeline/serialization_pipeline.ts","../../../gen3d/pipeline/debug_render_pipeline.ts","../../../gen3d/control/character_controller.ts","../../../gen3d/control/ray_cast_vehicle_controller.ts","../../../gen3d/pipeline/world.ts","../../../gen3d/geometry/collider_set.ts","../../../gen3d/dynamics/integration_parameters.ts","../../../gen3d/dynamics/impulse_joint_set.ts","../../../gen3d/dynamics/multibody_joint.ts","../../../gen3d/dynamics/multibody_joint_set.ts","../../../gen3d/dynamics/ccd_solver.ts","../../../gen3d/dynamics/island_manager.ts","../../../gen3d/dynamics/soft_body_set.ts","../../../../node_modules/tslib/tslib.es6.js","../../../../node_modules/base64-js/index.js","../../../gen3d/init.ts","../../../gen3d/exports.ts"],"sourcesContent":["/* @ts-self-types=\"./rapier_wasm3d.d.ts\" */\n\nexport class RawBroadPhase {\n    static __wrap(ptr) {\n        const obj = Object.create(RawBroadPhase.prototype);\n        obj.__wbg_ptr = ptr;\n        RawBroadPhaseFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawBroadPhaseFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawbroadphase_free(ptr, 0);\n    }\n    /**\n     * @param {RawNarrowPhase} narrow_phase\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @param {RawVector} rayOrig\n     * @param {RawVector} rayDir\n     * @param {number} maxToi\n     * @param {boolean} solid\n     * @param {number} filter_flags\n     * @param {number | null | undefined} filter_groups\n     * @param {number | null | undefined} filter_exclude_collider\n     * @param {number | null | undefined} filter_exclude_rigid_body\n     * @param {Function} filter_predicate\n     * @returns {RawRayColliderIntersection | undefined}\n     */\n    castRayAndGetNormal(narrow_phase, bodies, colliders, rayOrig, rayDir, maxToi, solid, filter_flags, filter_groups, filter_exclude_collider, filter_exclude_rigid_body, filter_predicate) {\n        try {\n            _assertClass(narrow_phase, RawNarrowPhase);\n            _assertClass(bodies, RawRigidBodySet);\n            _assertClass(colliders, RawColliderSet);\n            _assertClass(rayOrig, RawVector);\n            _assertClass(rayDir, RawVector);\n            const ret = wasm.rawbroadphase_castRayAndGetNormal(this.__wbg_ptr, narrow_phase.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr, rayOrig.__wbg_ptr, rayDir.__wbg_ptr, maxToi, solid, filter_flags, isLikeNone(filter_groups) ? Number.MAX_SAFE_INTEGER : (filter_groups) >>> 0, !isLikeNone(filter_exclude_collider), isLikeNone(filter_exclude_collider) ? 0 : filter_exclude_collider, !isLikeNone(filter_exclude_rigid_body), isLikeNone(filter_exclude_rigid_body) ? 0 : filter_exclude_rigid_body, addBorrowedObject(filter_predicate));\n            return ret === 0 ? undefined : RawRayColliderIntersection.__wrap(ret);\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {RawNarrowPhase} narrow_phase\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @param {RawVector} rayOrig\n     * @param {RawVector} rayDir\n     * @param {number} maxToi\n     * @param {boolean} solid\n     * @param {number} filter_flags\n     * @param {number | null | undefined} filter_groups\n     * @param {number | null | undefined} filter_exclude_collider\n     * @param {number | null | undefined} filter_exclude_rigid_body\n     * @param {Function} filter_predicate\n     * @returns {RawRayColliderHit | undefined}\n     */\n    castRay(narrow_phase, bodies, colliders, rayOrig, rayDir, maxToi, solid, filter_flags, filter_groups, filter_exclude_collider, filter_exclude_rigid_body, filter_predicate) {\n        try {\n            _assertClass(narrow_phase, RawNarrowPhase);\n            _assertClass(bodies, RawRigidBodySet);\n            _assertClass(colliders, RawColliderSet);\n            _assertClass(rayOrig, RawVector);\n            _assertClass(rayDir, RawVector);\n            const ret = wasm.rawbroadphase_castRay(this.__wbg_ptr, narrow_phase.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr, rayOrig.__wbg_ptr, rayDir.__wbg_ptr, maxToi, solid, filter_flags, isLikeNone(filter_groups) ? Number.MAX_SAFE_INTEGER : (filter_groups) >>> 0, !isLikeNone(filter_exclude_collider), isLikeNone(filter_exclude_collider) ? 0 : filter_exclude_collider, !isLikeNone(filter_exclude_rigid_body), isLikeNone(filter_exclude_rigid_body) ? 0 : filter_exclude_rigid_body, addBorrowedObject(filter_predicate));\n            return ret === 0 ? undefined : RawRayColliderHit.__wrap(ret);\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {RawNarrowPhase} narrow_phase\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @param {RawVector} shapePos\n     * @param {RawRotation} shapeRot\n     * @param {RawVector} shapeVel\n     * @param {RawShape} shape\n     * @param {number} target_distance\n     * @param {number} maxToi\n     * @param {boolean} stop_at_penetration\n     * @param {number} filter_flags\n     * @param {number | null | undefined} filter_groups\n     * @param {number | null | undefined} filter_exclude_collider\n     * @param {number | null | undefined} filter_exclude_rigid_body\n     * @param {Function} filter_predicate\n     * @returns {RawColliderShapeCastHit | undefined}\n     */\n    castShape(narrow_phase, bodies, colliders, shapePos, shapeRot, shapeVel, shape, target_distance, maxToi, stop_at_penetration, filter_flags, filter_groups, filter_exclude_collider, filter_exclude_rigid_body, filter_predicate) {\n        try {\n            _assertClass(narrow_phase, RawNarrowPhase);\n            _assertClass(bodies, RawRigidBodySet);\n            _assertClass(colliders, RawColliderSet);\n            _assertClass(shapePos, RawVector);\n            _assertClass(shapeRot, RawRotation);\n            _assertClass(shapeVel, RawVector);\n            _assertClass(shape, RawShape);\n            const ret = wasm.rawbroadphase_castShape(this.__wbg_ptr, narrow_phase.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr, shapePos.__wbg_ptr, shapeRot.__wbg_ptr, shapeVel.__wbg_ptr, shape.__wbg_ptr, target_distance, maxToi, stop_at_penetration, filter_flags, isLikeNone(filter_groups) ? Number.MAX_SAFE_INTEGER : (filter_groups) >>> 0, !isLikeNone(filter_exclude_collider), isLikeNone(filter_exclude_collider) ? 0 : filter_exclude_collider, !isLikeNone(filter_exclude_rigid_body), isLikeNone(filter_exclude_rigid_body) ? 0 : filter_exclude_rigid_body, addBorrowedObject(filter_predicate));\n            return ret === 0 ? undefined : RawColliderShapeCastHit.__wrap(ret);\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {RawNarrowPhase} narrow_phase\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @param {RawVector} aabbCenter\n     * @param {RawVector} aabbHalfExtents\n     * @param {Function} callback\n     */\n    collidersWithAabbIntersectingAabb(narrow_phase, bodies, colliders, aabbCenter, aabbHalfExtents, callback) {\n        try {\n            _assertClass(narrow_phase, RawNarrowPhase);\n            _assertClass(bodies, RawRigidBodySet);\n            _assertClass(colliders, RawColliderSet);\n            _assertClass(aabbCenter, RawVector);\n            _assertClass(aabbHalfExtents, RawVector);\n            wasm.rawbroadphase_collidersWithAabbIntersectingAabb(this.__wbg_ptr, narrow_phase.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr, aabbCenter.__wbg_ptr, aabbHalfExtents.__wbg_ptr, addBorrowedObject(callback));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {RawNarrowPhase} narrow_phase\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @param {RawVector} shapePos\n     * @param {RawRotation} shapeRot\n     * @param {RawShape} shape\n     * @param {number} filter_flags\n     * @param {number | null | undefined} filter_groups\n     * @param {number | null | undefined} filter_exclude_collider\n     * @param {number | null | undefined} filter_exclude_rigid_body\n     * @param {Function} filter_predicate\n     * @returns {number | undefined}\n     */\n    intersectionWithShape(narrow_phase, bodies, colliders, shapePos, shapeRot, shape, filter_flags, filter_groups, filter_exclude_collider, filter_exclude_rigid_body, filter_predicate) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            _assertClass(narrow_phase, RawNarrowPhase);\n            _assertClass(bodies, RawRigidBodySet);\n            _assertClass(colliders, RawColliderSet);\n            _assertClass(shapePos, RawVector);\n            _assertClass(shapeRot, RawRotation);\n            _assertClass(shape, RawShape);\n            wasm.rawbroadphase_intersectionWithShape(retptr, this.__wbg_ptr, narrow_phase.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr, shapePos.__wbg_ptr, shapeRot.__wbg_ptr, shape.__wbg_ptr, filter_flags, isLikeNone(filter_groups) ? Number.MAX_SAFE_INTEGER : (filter_groups) >>> 0, !isLikeNone(filter_exclude_collider), isLikeNone(filter_exclude_collider) ? 0 : filter_exclude_collider, !isLikeNone(filter_exclude_rigid_body), isLikeNone(filter_exclude_rigid_body) ? 0 : filter_exclude_rigid_body, addBorrowedObject(filter_predicate));\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r2 = getDataViewMemory0().getFloat64(retptr + 8 * 1, true);\n            return r0 === 0 ? undefined : r2;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {RawNarrowPhase} narrow_phase\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @param {RawVector} point\n     * @param {Function} callback\n     * @param {number} filter_flags\n     * @param {number | null | undefined} filter_groups\n     * @param {number | null | undefined} filter_exclude_collider\n     * @param {number | null | undefined} filter_exclude_rigid_body\n     * @param {Function} filter_predicate\n     */\n    intersectionsWithPoint(narrow_phase, bodies, colliders, point, callback, filter_flags, filter_groups, filter_exclude_collider, filter_exclude_rigid_body, filter_predicate) {\n        try {\n            _assertClass(narrow_phase, RawNarrowPhase);\n            _assertClass(bodies, RawRigidBodySet);\n            _assertClass(colliders, RawColliderSet);\n            _assertClass(point, RawVector);\n            wasm.rawbroadphase_intersectionsWithPoint(this.__wbg_ptr, narrow_phase.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr, point.__wbg_ptr, addBorrowedObject(callback), filter_flags, isLikeNone(filter_groups) ? Number.MAX_SAFE_INTEGER : (filter_groups) >>> 0, !isLikeNone(filter_exclude_collider), isLikeNone(filter_exclude_collider) ? 0 : filter_exclude_collider, !isLikeNone(filter_exclude_rigid_body), isLikeNone(filter_exclude_rigid_body) ? 0 : filter_exclude_rigid_body, addBorrowedObject(filter_predicate));\n        } finally {\n            heap[stack_pointer++] = undefined;\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {RawNarrowPhase} narrow_phase\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @param {RawVector} rayOrig\n     * @param {RawVector} rayDir\n     * @param {number} maxToi\n     * @param {boolean} solid\n     * @param {Function} callback\n     * @param {number} filter_flags\n     * @param {number | null | undefined} filter_groups\n     * @param {number | null | undefined} filter_exclude_collider\n     * @param {number | null | undefined} filter_exclude_rigid_body\n     * @param {Function} filter_predicate\n     */\n    intersectionsWithRay(narrow_phase, bodies, colliders, rayOrig, rayDir, maxToi, solid, callback, filter_flags, filter_groups, filter_exclude_collider, filter_exclude_rigid_body, filter_predicate) {\n        try {\n            _assertClass(narrow_phase, RawNarrowPhase);\n            _assertClass(bodies, RawRigidBodySet);\n            _assertClass(colliders, RawColliderSet);\n            _assertClass(rayOrig, RawVector);\n            _assertClass(rayDir, RawVector);\n            wasm.rawbroadphase_intersectionsWithRay(this.__wbg_ptr, narrow_phase.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr, rayOrig.__wbg_ptr, rayDir.__wbg_ptr, maxToi, solid, addBorrowedObject(callback), filter_flags, isLikeNone(filter_groups) ? Number.MAX_SAFE_INTEGER : (filter_groups) >>> 0, !isLikeNone(filter_exclude_collider), isLikeNone(filter_exclude_collider) ? 0 : filter_exclude_collider, !isLikeNone(filter_exclude_rigid_body), isLikeNone(filter_exclude_rigid_body) ? 0 : filter_exclude_rigid_body, addBorrowedObject(filter_predicate));\n        } finally {\n            heap[stack_pointer++] = undefined;\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {RawNarrowPhase} narrow_phase\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @param {RawVector} shapePos\n     * @param {RawRotation} shapeRot\n     * @param {RawShape} shape\n     * @param {Function} callback\n     * @param {number} filter_flags\n     * @param {number | null | undefined} filter_groups\n     * @param {number | null | undefined} filter_exclude_collider\n     * @param {number | null | undefined} filter_exclude_rigid_body\n     * @param {Function} filter_predicate\n     */\n    intersectionsWithShape(narrow_phase, bodies, colliders, shapePos, shapeRot, shape, callback, filter_flags, filter_groups, filter_exclude_collider, filter_exclude_rigid_body, filter_predicate) {\n        try {\n            _assertClass(narrow_phase, RawNarrowPhase);\n            _assertClass(bodies, RawRigidBodySet);\n            _assertClass(colliders, RawColliderSet);\n            _assertClass(shapePos, RawVector);\n            _assertClass(shapeRot, RawRotation);\n            _assertClass(shape, RawShape);\n            wasm.rawbroadphase_intersectionsWithShape(this.__wbg_ptr, narrow_phase.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr, shapePos.__wbg_ptr, shapeRot.__wbg_ptr, shape.__wbg_ptr, addBorrowedObject(callback), filter_flags, isLikeNone(filter_groups) ? Number.MAX_SAFE_INTEGER : (filter_groups) >>> 0, !isLikeNone(filter_exclude_collider), isLikeNone(filter_exclude_collider) ? 0 : filter_exclude_collider, !isLikeNone(filter_exclude_rigid_body), isLikeNone(filter_exclude_rigid_body) ? 0 : filter_exclude_rigid_body, addBorrowedObject(filter_predicate));\n        } finally {\n            heap[stack_pointer++] = undefined;\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    constructor() {\n        const ret = wasm.rawbroadphase_new();\n        this.__wbg_ptr = ret;\n        RawBroadPhaseFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n    /**\n     * @param {RawNarrowPhase} narrow_phase\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @param {RawVector} point\n     * @param {number} filter_flags\n     * @param {number | null | undefined} filter_groups\n     * @param {number | null | undefined} filter_exclude_collider\n     * @param {number | null | undefined} filter_exclude_rigid_body\n     * @param {Function} filter_predicate\n     * @returns {RawPointColliderProjection | undefined}\n     */\n    projectPointAndGetFeature(narrow_phase, bodies, colliders, point, filter_flags, filter_groups, filter_exclude_collider, filter_exclude_rigid_body, filter_predicate) {\n        try {\n            _assertClass(narrow_phase, RawNarrowPhase);\n            _assertClass(bodies, RawRigidBodySet);\n            _assertClass(colliders, RawColliderSet);\n            _assertClass(point, RawVector);\n            const ret = wasm.rawbroadphase_projectPointAndGetFeature(this.__wbg_ptr, narrow_phase.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr, point.__wbg_ptr, filter_flags, isLikeNone(filter_groups) ? Number.MAX_SAFE_INTEGER : (filter_groups) >>> 0, !isLikeNone(filter_exclude_collider), isLikeNone(filter_exclude_collider) ? 0 : filter_exclude_collider, !isLikeNone(filter_exclude_rigid_body), isLikeNone(filter_exclude_rigid_body) ? 0 : filter_exclude_rigid_body, addBorrowedObject(filter_predicate));\n            return ret === 0 ? undefined : RawPointColliderProjection.__wrap(ret);\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {RawNarrowPhase} narrow_phase\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @param {RawVector} point\n     * @param {boolean} solid\n     * @param {number} filter_flags\n     * @param {number | null | undefined} filter_groups\n     * @param {number | null | undefined} filter_exclude_collider\n     * @param {number | null | undefined} filter_exclude_rigid_body\n     * @param {Function} filter_predicate\n     * @returns {RawPointColliderProjection | undefined}\n     */\n    projectPoint(narrow_phase, bodies, colliders, point, solid, filter_flags, filter_groups, filter_exclude_collider, filter_exclude_rigid_body, filter_predicate) {\n        try {\n            _assertClass(narrow_phase, RawNarrowPhase);\n            _assertClass(bodies, RawRigidBodySet);\n            _assertClass(colliders, RawColliderSet);\n            _assertClass(point, RawVector);\n            const ret = wasm.rawbroadphase_projectPoint(this.__wbg_ptr, narrow_phase.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr, point.__wbg_ptr, solid, filter_flags, isLikeNone(filter_groups) ? Number.MAX_SAFE_INTEGER : (filter_groups) >>> 0, !isLikeNone(filter_exclude_collider), isLikeNone(filter_exclude_collider) ? 0 : filter_exclude_collider, !isLikeNone(filter_exclude_rigid_body), isLikeNone(filter_exclude_rigid_body) ? 0 : filter_exclude_rigid_body, addBorrowedObject(filter_predicate));\n            return ret === 0 ? undefined : RawPointColliderProjection.__wrap(ret);\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n}\nif (Symbol.dispose) RawBroadPhase.prototype[Symbol.dispose] = RawBroadPhase.prototype.free;\n\nexport class RawCCDSolver {\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawCCDSolverFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawccdsolver_free(ptr, 0);\n    }\n    constructor() {\n        const ret = wasm.rawccdsolver_new();\n        this.__wbg_ptr = ret;\n        RawCCDSolverFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n}\nif (Symbol.dispose) RawCCDSolver.prototype[Symbol.dispose] = RawCCDSolver.prototype.free;\n\nexport class RawCharacterCollision {\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawCharacterCollisionFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawcharactercollision_free(ptr, 0);\n    }\n    /**\n     * @returns {number}\n     */\n    handle() {\n        const ret = wasm.rawcharactercollision_handle(this.__wbg_ptr);\n        return ret;\n    }\n    constructor() {\n        const ret = wasm.rawcharactercollision_new();\n        this.__wbg_ptr = ret;\n        RawCharacterCollisionFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n    /**\n     * @returns {number}\n     */\n    toi() {\n        const ret = wasm.rawcharactercollision_toi(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @param {Float32Array} scratch_buffer\n     */\n    translationDeltaApplied(scratch_buffer) {\n        try {\n            wasm.rawcharactercollision_translationDeltaApplied(this.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {Float32Array} scratch_buffer\n     */\n    translationDeltaRemaining(scratch_buffer) {\n        try {\n            wasm.rawcharactercollision_translationDeltaRemaining(this.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {Float32Array} scratch_buffer\n     */\n    worldNormal1(scratch_buffer) {\n        try {\n            wasm.rawcharactercollision_worldNormal1(this.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {Float32Array} scratch_buffer\n     */\n    worldNormal2(scratch_buffer) {\n        try {\n            wasm.rawcharactercollision_worldNormal2(this.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {Float32Array} scratch_buffer\n     */\n    worldWitness1(scratch_buffer) {\n        try {\n            wasm.rawcharactercollision_worldWitness1(this.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {Float32Array} scratch_buffer\n     */\n    worldWitness2(scratch_buffer) {\n        try {\n            wasm.rawcharactercollision_worldWitness2(this.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n}\nif (Symbol.dispose) RawCharacterCollision.prototype[Symbol.dispose] = RawCharacterCollision.prototype.free;\n\nexport class RawColliderSet {\n    static __wrap(ptr) {\n        const obj = Object.create(RawColliderSet.prototype);\n        obj.__wbg_ptr = ptr;\n        RawColliderSetFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawColliderSetFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawcolliderset_free(ptr, 0);\n    }\n    /**\n     * The collision types enabled for this collider.\n     * @param {number} handle\n     * @returns {number}\n     */\n    coActiveCollisionTypes(handle) {\n        const ret = wasm.rawcolliderset_coActiveCollisionTypes(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * The events enabled for this collider.\n     * @param {number} handle\n     * @returns {number}\n     */\n    coActiveEvents(handle) {\n        const ret = wasm.rawcolliderset_coActiveEvents(this.__wbg_ptr, handle);\n        return ret >>> 0;\n    }\n    /**\n     * The physics hooks enabled for this collider.\n     * @param {number} handle\n     * @returns {number}\n     */\n    coActiveHooks(handle) {\n        const ret = wasm.rawcolliderset_coActiveHooks(this.__wbg_ptr, handle);\n        return ret >>> 0;\n    }\n    /**\n     * @param {number} handle\n     * @param {RawVector} collider1Vel\n     * @param {number} collider2handle\n     * @param {RawVector} collider2Vel\n     * @param {number} target_distance\n     * @param {number} max_toi\n     * @param {boolean} stop_at_penetration\n     * @returns {RawColliderShapeCastHit | undefined}\n     */\n    coCastCollider(handle, collider1Vel, collider2handle, collider2Vel, target_distance, max_toi, stop_at_penetration) {\n        _assertClass(collider1Vel, RawVector);\n        _assertClass(collider2Vel, RawVector);\n        const ret = wasm.rawcolliderset_coCastCollider(this.__wbg_ptr, handle, collider1Vel.__wbg_ptr, collider2handle, collider2Vel.__wbg_ptr, target_distance, max_toi, stop_at_penetration);\n        return ret === 0 ? undefined : RawColliderShapeCastHit.__wrap(ret);\n    }\n    /**\n     * @param {number} handle\n     * @param {RawVector} rayOrig\n     * @param {RawVector} rayDir\n     * @param {number} maxToi\n     * @param {boolean} solid\n     * @returns {RawRayIntersection | undefined}\n     */\n    coCastRayAndGetNormal(handle, rayOrig, rayDir, maxToi, solid) {\n        _assertClass(rayOrig, RawVector);\n        _assertClass(rayDir, RawVector);\n        const ret = wasm.rawcolliderset_coCastRayAndGetNormal(this.__wbg_ptr, handle, rayOrig.__wbg_ptr, rayDir.__wbg_ptr, maxToi, solid);\n        return ret === 0 ? undefined : RawRayIntersection.__wrap(ret);\n    }\n    /**\n     * @param {number} handle\n     * @param {RawVector} rayOrig\n     * @param {RawVector} rayDir\n     * @param {number} maxToi\n     * @param {boolean} solid\n     * @returns {number}\n     */\n    coCastRay(handle, rayOrig, rayDir, maxToi, solid) {\n        _assertClass(rayOrig, RawVector);\n        _assertClass(rayDir, RawVector);\n        const ret = wasm.rawcolliderset_coCastRay(this.__wbg_ptr, handle, rayOrig.__wbg_ptr, rayDir.__wbg_ptr, maxToi, solid);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {RawVector} colliderVel\n     * @param {RawShape} shape2\n     * @param {RawVector} shape2Pos\n     * @param {RawRotation} shape2Rot\n     * @param {RawVector} shape2Vel\n     * @param {number} target_distance\n     * @param {number} maxToi\n     * @param {boolean} stop_at_penetration\n     * @returns {RawShapeCastHit | undefined}\n     */\n    coCastShape(handle, colliderVel, shape2, shape2Pos, shape2Rot, shape2Vel, target_distance, maxToi, stop_at_penetration) {\n        _assertClass(colliderVel, RawVector);\n        _assertClass(shape2, RawShape);\n        _assertClass(shape2Pos, RawVector);\n        _assertClass(shape2Rot, RawRotation);\n        _assertClass(shape2Vel, RawVector);\n        const ret = wasm.rawcolliderset_coCastShape(this.__wbg_ptr, handle, colliderVel.__wbg_ptr, shape2.__wbg_ptr, shape2Pos.__wbg_ptr, shape2Rot.__wbg_ptr, shape2Vel.__wbg_ptr, target_distance, maxToi, stop_at_penetration);\n        return ret === 0 ? undefined : RawShapeCastHit.__wrap(ret);\n    }\n    /**\n     * The collision groups of this collider.\n     * @param {number} handle\n     * @returns {number}\n     */\n    coCollisionGroups(handle) {\n        const ret = wasm.rawcolliderset_coCollisionGroups(this.__wbg_ptr, handle);\n        return ret >>> 0;\n    }\n    /**\n     * @param {number} handle1\n     * @param {number} handle2\n     * @param {number} shift_x\n     * @param {number} shift_y\n     * @param {number} shift_z\n     */\n    coCombineVoxelStates(handle1, handle2, shift_x, shift_y, shift_z) {\n        wasm.rawcolliderset_coCombineVoxelStates(this.__wbg_ptr, handle1, handle2, shift_x, shift_y, shift_z);\n    }\n    /**\n     * @param {number} handle\n     * @returns {number | undefined}\n     */\n    coCompoundFlags(handle) {\n        const ret = wasm.rawcolliderset_coCompoundFlags(this.__wbg_ptr, handle);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} collider2handle\n     * @param {number} prediction\n     * @returns {RawShapeContact | undefined}\n     */\n    coContactCollider(handle, collider2handle, prediction) {\n        const ret = wasm.rawcolliderset_coContactCollider(this.__wbg_ptr, handle, collider2handle, prediction);\n        return ret === 0 ? undefined : RawShapeContact.__wrap(ret);\n    }\n    /**\n     * The total force magnitude beyond which a contact force event can be emitted.\n     * @param {number} handle\n     * @returns {number}\n     */\n    coContactForceEventThreshold(handle) {\n        const ret = wasm.rawcolliderset_coContactForceEventThreshold(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {RawShape} shape2\n     * @param {RawVector} shapePos2\n     * @param {RawRotation} shapeRot2\n     * @param {number} prediction\n     * @returns {RawShapeContact | undefined}\n     */\n    coContactShape(handle, shape2, shapePos2, shapeRot2, prediction) {\n        _assertClass(shape2, RawShape);\n        _assertClass(shapePos2, RawVector);\n        _assertClass(shapeRot2, RawRotation);\n        const ret = wasm.rawcolliderset_coContactShape(this.__wbg_ptr, handle, shape2.__wbg_ptr, shapePos2.__wbg_ptr, shapeRot2.__wbg_ptr, prediction);\n        return ret === 0 ? undefined : RawShapeContact.__wrap(ret);\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    coContactSkin(handle) {\n        const ret = wasm.rawcolliderset_coContactSkin(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {RawVector} point\n     * @returns {boolean}\n     */\n    coContainsPoint(handle, point) {\n        _assertClass(point, RawVector);\n        const ret = wasm.rawcolliderset_coContainsPoint(this.__wbg_ptr, handle, point.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * The density of this collider.\n     * @param {number} handle\n     * @returns {number}\n     */\n    coDensity(handle) {\n        const ret = wasm.rawcolliderset_coDensity(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    coFrictionCombineRule(handle) {\n        const ret = wasm.rawcolliderset_coFrictionCombineRule(this.__wbg_ptr, handle);\n        return ret >>> 0;\n    }\n    /**\n     * The friction coefficient of this collider.\n     * @param {number} handle\n     * @returns {number}\n     */\n    coFriction(handle) {\n        const ret = wasm.rawcolliderset_coFriction(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * The half-extents of this collider if it has a cuboid shape.\n     *\n     * Returns `false` if it doesn’t have a cuboid shape.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     * @returns {boolean}\n     */\n    coHalfExtents(handle, scratch_buffer) {\n        try {\n            const ret = wasm.rawcolliderset_coHalfExtents(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n            return ret !== 0;\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * The half height of this collider if it is a capsule, cylinder, or cone shape.\n     * @param {number} handle\n     * @returns {number | undefined}\n     */\n    coHalfHeight(handle) {\n        const ret = wasm.rawcolliderset_coHalfHeight(this.__wbg_ptr, handle);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * The outward normal of this collider if it has a half-space shape.\n     *\n     * Returns `false` if it doesn’t have a half-space shape.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     * @returns {boolean}\n     */\n    coHalfspaceNormal(handle, scratch_buffer) {\n        try {\n            const ret = wasm.rawcolliderset_coHalfspaceNormal(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n            return ret !== 0;\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} handle\n     * @returns {number | undefined}\n     */\n    coHeightFieldFlags(handle) {\n        const ret = wasm.rawcolliderset_coHeightFieldFlags(this.__wbg_ptr, handle);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * The height of this heightfield if it is one.\n     * @param {number} handle\n     * @returns {Float32Array | undefined}\n     */\n    coHeightfieldHeights(handle) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawcolliderset_coHeightfieldHeights(retptr, this.__wbg_ptr, handle);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            let v1;\n            if (r0 !== 0) {\n                v1 = getArrayF32FromWasm0(r0, r1).slice();\n                wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            }\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * The number of columns on this heightfield's height matrix, if it is one.\n     * @param {number} handle\n     * @returns {number | undefined}\n     */\n    coHeightfieldNCols(handle) {\n        const ret = wasm.rawcolliderset_coHeightfieldNCols(this.__wbg_ptr, handle);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * The number of rows on this heightfield's height matrix, if it is one.\n     * @param {number} handle\n     * @returns {number | undefined}\n     */\n    coHeightfieldNRows(handle) {\n        const ret = wasm.rawcolliderset_coHeightfieldNRows(this.__wbg_ptr, handle);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * The scaling factor applied to this heightfield if it is one.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     * @returns {boolean}\n     */\n    coHeightfieldScale(handle, scratch_buffer) {\n        try {\n            const ret = wasm.rawcolliderset_coHeightfieldScale(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n            return ret !== 0;\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * The indices of this triangle mesh, polyline, or convex polyhedron, if it is one.\n     *\n     * For convex polyhedra, the indices refer to the convex hull recomputed with\n     * `try_convex_hull` (matching `coVertices`), not to the original input mesh.\n     * @param {number} handle\n     * @returns {Uint32Array | undefined}\n     */\n    coIndices(handle) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawcolliderset_coIndices(retptr, this.__wbg_ptr, handle);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            let v1;\n            if (r0 !== 0) {\n                v1 = getArrayU32FromWasm0(r0, r1).slice();\n                wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            }\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} handle\n     * @param {RawVector} rayOrig\n     * @param {RawVector} rayDir\n     * @param {number} maxToi\n     * @returns {boolean}\n     */\n    coIntersectsRay(handle, rayOrig, rayDir, maxToi) {\n        _assertClass(rayOrig, RawVector);\n        _assertClass(rayDir, RawVector);\n        const ret = wasm.rawcolliderset_coIntersectsRay(this.__wbg_ptr, handle, rayOrig.__wbg_ptr, rayDir.__wbg_ptr, maxToi);\n        return ret !== 0;\n    }\n    /**\n     * @param {number} handle\n     * @param {RawShape} shape2\n     * @param {RawVector} shapePos2\n     * @param {RawRotation} shapeRot2\n     * @returns {boolean}\n     */\n    coIntersectsShape(handle, shape2, shapePos2, shapeRot2) {\n        _assertClass(shape2, RawShape);\n        _assertClass(shapePos2, RawVector);\n        _assertClass(shapeRot2, RawRotation);\n        const ret = wasm.rawcolliderset_coIntersectsShape(this.__wbg_ptr, handle, shape2.__wbg_ptr, shapePos2.__wbg_ptr, shapeRot2.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * Does this collider hold a soft body's deformable collision mesh?\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    coIsDeformable(handle) {\n        const ret = wasm.rawcolliderset_coIsDeformable(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    coIsEnabled(handle) {\n        const ret = wasm.rawcolliderset_coIsEnabled(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * Is this collider a sensor?\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    coIsSensor(handle) {\n        const ret = wasm.rawcolliderset_coIsSensor(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * The mass of this collider.\n     * @param {number} handle\n     * @returns {number}\n     */\n    coMass(handle) {\n        const ret = wasm.rawcolliderset_coMass(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * The unique integer identifier of the collider this collider is attached to.\n     * @param {number} handle\n     * @returns {number | undefined}\n     */\n    coParent(handle) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawcolliderset_coParent(retptr, this.__wbg_ptr, handle);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r2 = getDataViewMemory0().getFloat64(retptr + 8 * 1, true);\n            return r0 === 0 ? undefined : r2;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} handle\n     * @returns {number | undefined}\n     */\n    coPolylineFlags(handle) {\n        const ret = wasm.rawcolliderset_coPolylineFlags(this.__wbg_ptr, handle);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {RawVector} point\n     * @param {boolean} solid\n     * @returns {RawPointProjection}\n     */\n    coProjectPoint(handle, point, solid) {\n        _assertClass(point, RawVector);\n        const ret = wasm.rawcolliderset_coProjectPoint(this.__wbg_ptr, handle, point.__wbg_ptr, solid);\n        return RawPointProjection.__wrap(ret);\n    }\n    /**\n     * @param {number} handle1\n     * @param {number} handle2\n     * @param {number} ix\n     * @param {number} iy\n     * @param {number} iz\n     * @param {number} shift_x\n     * @param {number} shift_y\n     * @param {number} shift_z\n     */\n    coPropagateVoxelChange(handle1, handle2, ix, iy, iz, shift_x, shift_y, shift_z) {\n        wasm.rawcolliderset_coPropagateVoxelChange(this.__wbg_ptr, handle1, handle2, ix, iy, iz, shift_x, shift_y, shift_z);\n    }\n    /**\n     * The radius of this collider if it is a ball, capsule, cylinder, or cone shape.\n     * @param {number} handle\n     * @returns {number | undefined}\n     */\n    coRadius(handle) {\n        const ret = wasm.rawcolliderset_coRadius(this.__wbg_ptr, handle);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    coRestitutionCombineRule(handle) {\n        const ret = wasm.rawcolliderset_coRestitutionCombineRule(this.__wbg_ptr, handle);\n        return ret >>> 0;\n    }\n    /**\n     * The restitution coefficient of this collider.\n     * @param {number} handle\n     * @returns {number}\n     */\n    coRestitution(handle) {\n        const ret = wasm.rawcolliderset_coRestitution(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * The orientation of this collider relative to its parent rigid-body.\n     *\n     * Returns `false` if it doesn’t have a parent.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     * @returns {boolean}\n     */\n    coRotationWrtParent(handle, scratch_buffer) {\n        try {\n            const ret = wasm.rawcolliderset_coRotationWrtParent(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n            return ret !== 0;\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * The world-space orientation of this collider.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    coRotation(handle, scratch_buffer) {\n        try {\n            wasm.rawcolliderset_coRotation(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * The radius of the round edges of this collider.\n     * @param {number} handle\n     * @returns {number | undefined}\n     */\n    coRoundRadius(handle) {\n        const ret = wasm.rawcolliderset_coRoundRadius(this.__wbg_ptr, handle);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} types\n     */\n    coSetActiveCollisionTypes(handle, types) {\n        wasm.rawcolliderset_coSetActiveCollisionTypes(this.__wbg_ptr, handle, types);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} events\n     */\n    coSetActiveEvents(handle, events) {\n        wasm.rawcolliderset_coSetActiveEvents(this.__wbg_ptr, handle, events);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} hooks\n     */\n    coSetActiveHooks(handle, hooks) {\n        wasm.rawcolliderset_coSetActiveHooks(this.__wbg_ptr, handle, hooks);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} groups\n     */\n    coSetCollisionGroups(handle, groups) {\n        wasm.rawcolliderset_coSetCollisionGroups(this.__wbg_ptr, handle, groups);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} threshold\n     */\n    coSetContactForceEventThreshold(handle, threshold) {\n        wasm.rawcolliderset_coSetContactForceEventThreshold(this.__wbg_ptr, handle, threshold);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} contact_skin\n     */\n    coSetContactSkin(handle, contact_skin) {\n        wasm.rawcolliderset_coSetContactSkin(this.__wbg_ptr, handle, contact_skin);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} density\n     */\n    coSetDensity(handle, density) {\n        wasm.rawcolliderset_coSetDensity(this.__wbg_ptr, handle, density);\n    }\n    /**\n     * @param {number} handle\n     * @param {boolean} enabled\n     */\n    coSetEnabled(handle, enabled) {\n        wasm.rawcolliderset_coSetEnabled(this.__wbg_ptr, handle, enabled);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} rule\n     */\n    coSetFrictionCombineRule(handle, rule) {\n        wasm.rawcolliderset_coSetFrictionCombineRule(this.__wbg_ptr, handle, rule);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} friction\n     */\n    coSetFriction(handle, friction) {\n        wasm.rawcolliderset_coSetFriction(this.__wbg_ptr, handle, friction);\n    }\n    /**\n     * Set the half-extents of this collider if it has a cuboid shape.\n     * @param {number} handle\n     * @param {RawVector} newHalfExtents\n     */\n    coSetHalfExtents(handle, newHalfExtents) {\n        _assertClass(newHalfExtents, RawVector);\n        wasm.rawcolliderset_coSetHalfExtents(this.__wbg_ptr, handle, newHalfExtents.__wbg_ptr);\n    }\n    /**\n     * Set the half height of this collider if it is a capsule, cylinder, or cone shape.\n     * @param {number} handle\n     * @param {number} newHalfheight\n     */\n    coSetHalfHeight(handle, newHalfheight) {\n        wasm.rawcolliderset_coSetHalfHeight(this.__wbg_ptr, handle, newHalfheight);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} mass\n     * @param {RawVector} centerOfMass\n     * @param {RawVector} principalAngularInertia\n     * @param {RawRotation} angularInertiaFrame\n     */\n    coSetMassProperties(handle, mass, centerOfMass, principalAngularInertia, angularInertiaFrame) {\n        _assertClass(centerOfMass, RawVector);\n        _assertClass(principalAngularInertia, RawVector);\n        _assertClass(angularInertiaFrame, RawRotation);\n        wasm.rawcolliderset_coSetMassProperties(this.__wbg_ptr, handle, mass, centerOfMass.__wbg_ptr, principalAngularInertia.__wbg_ptr, angularInertiaFrame.__wbg_ptr);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} mass\n     */\n    coSetMass(handle, mass) {\n        wasm.rawcolliderset_coSetMass(this.__wbg_ptr, handle, mass);\n    }\n    /**\n     * Set the radius of this collider if it is a ball, capsule, cylinder, or cone shape.\n     * @param {number} handle\n     * @param {number} newRadius\n     */\n    coSetRadius(handle, newRadius) {\n        wasm.rawcolliderset_coSetRadius(this.__wbg_ptr, handle, newRadius);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} rule\n     */\n    coSetRestitutionCombineRule(handle, rule) {\n        wasm.rawcolliderset_coSetRestitutionCombineRule(this.__wbg_ptr, handle, rule);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} restitution\n     */\n    coSetRestitution(handle, restitution) {\n        wasm.rawcolliderset_coSetRestitution(this.__wbg_ptr, handle, restitution);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} x\n     * @param {number} y\n     * @param {number} z\n     * @param {number} w\n     */\n    coSetRotationWrtParent(handle, x, y, z, w) {\n        wasm.rawcolliderset_coSetRotationWrtParent(this.__wbg_ptr, handle, x, y, z, w);\n    }\n    /**\n     * Sets the rotation quaternion of this collider.\n     *\n     * This does nothing if a zero quaternion is provided.\n     *\n     * # Parameters\n     * - `x`: the first vector component of the quaternion.\n     * - `y`: the second vector component of the quaternion.\n     * - `z`: the third vector component of the quaternion.\n     * - `w`: the scalar component of the quaternion.\n     * - `wakeUp`: forces the collider to wake-up so it is properly affected by forces if it\n     * wasn't moving before modifying its position.\n     * @param {number} handle\n     * @param {number} x\n     * @param {number} y\n     * @param {number} z\n     * @param {number} w\n     */\n    coSetRotation(handle, x, y, z, w) {\n        wasm.rawcolliderset_coSetRotation(this.__wbg_ptr, handle, x, y, z, w);\n    }\n    /**\n     * Set the radius of the round edges of this collider.\n     * @param {number} handle\n     * @param {number} newBorderRadius\n     */\n    coSetRoundRadius(handle, newBorderRadius) {\n        wasm.rawcolliderset_coSetRoundRadius(this.__wbg_ptr, handle, newBorderRadius);\n    }\n    /**\n     * @param {number} handle\n     * @param {boolean} is_sensor\n     */\n    coSetSensor(handle, is_sensor) {\n        wasm.rawcolliderset_coSetSensor(this.__wbg_ptr, handle, is_sensor);\n    }\n    /**\n     * @param {number} handle\n     * @param {RawShape} shape\n     */\n    coSetShape(handle, shape) {\n        _assertClass(shape, RawShape);\n        wasm.rawcolliderset_coSetShape(this.__wbg_ptr, handle, shape.__wbg_ptr);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} groups\n     */\n    coSetSolverGroups(handle, groups) {\n        wasm.rawcolliderset_coSetSolverGroups(this.__wbg_ptr, handle, groups);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} x\n     * @param {number} y\n     * @param {number} z\n     */\n    coSetTranslationWrtParent(handle, x, y, z) {\n        wasm.rawcolliderset_coSetTranslationWrtParent(this.__wbg_ptr, handle, x, y, z);\n    }\n    /**\n     * Sets the translation of this collider.\n     *\n     * # Parameters\n     * - `x`: the world-space position of the collider along the `x` axis.\n     * - `y`: the world-space position of the collider along the `y` axis.\n     * - `z`: the world-space position of the collider along the `z` axis.\n     * - `wakeUp`: forces the collider to wake-up so it is properly affected by forces if it\n     * wasn't moving before modifying its position.\n     * @param {number} handle\n     * @param {number} x\n     * @param {number} y\n     * @param {number} z\n     */\n    coSetTranslation(handle, x, y, z) {\n        wasm.rawcolliderset_coSetTranslation(this.__wbg_ptr, handle, x, y, z);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} ix\n     * @param {number} iy\n     * @param {number} iz\n     * @param {boolean} filled\n     */\n    coSetVoxel(handle, ix, iy, iz, filled) {\n        wasm.rawcolliderset_coSetVoxel(this.__wbg_ptr, handle, ix, iy, iz, filled);\n    }\n    /**\n     * The type of the shape of this collider.\n     * @param {number} handle\n     * @returns {RawShapeType}\n     */\n    coShapeType(handle) {\n        const ret = wasm.rawcolliderset_coShapeType(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @returns {RawShape}\n     */\n    coShape(handle) {\n        const ret = wasm.rawcolliderset_coShape(this.__wbg_ptr, handle);\n        return RawShape.__wrap(ret);\n    }\n    /**\n     * The soft body whose deformable collision mesh this collider holds, if any.\n     * @param {number} handle\n     * @returns {number | undefined}\n     */\n    coSoftBody(handle) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawcolliderset_coSoftBody(retptr, this.__wbg_ptr, handle);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r2 = getDataViewMemory0().getFloat64(retptr + 8 * 1, true);\n            return r0 === 0 ? undefined : r2;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * The solver groups of this collider.\n     * @param {number} handle\n     * @returns {number}\n     */\n    coSolverGroups(handle) {\n        const ret = wasm.rawcolliderset_coSolverGroups(this.__wbg_ptr, handle);\n        return ret >>> 0;\n    }\n    /**\n     * The translation of this collider relative to its parent rigid-body.\n     *\n     * Returns `false` if it doesn’t have a parent.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     * @returns {boolean}\n     */\n    coTranslationWrtParent(handle, scratch_buffer) {\n        try {\n            const ret = wasm.rawcolliderset_coTranslationWrtParent(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n            return ret !== 0;\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * The world-space translation of this collider.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    coTranslation(handle, scratch_buffer) {\n        try {\n            wasm.rawcolliderset_coTranslation(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} handle\n     * @returns {number | undefined}\n     */\n    coTriMeshFlags(handle) {\n        const ret = wasm.rawcolliderset_coTriMeshFlags(this.__wbg_ptr, handle);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * The vertices of this triangle mesh, polyline, convex polyhedron, segment, triangle or convex polyhedron, if it is one.\n     *\n     * For convex polyhedra, this returns the vertices of a convex hull recomputed with\n     * `try_convex_hull`, so they may differ in count and order from the points the shape\n     * was built from. This guarantees the result can be used to reconstruct the shape.\n     * @param {number} handle\n     * @returns {Float32Array | undefined}\n     */\n    coVertices(handle) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawcolliderset_coVertices(retptr, this.__wbg_ptr, handle);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            let v1;\n            if (r0 !== 0) {\n                v1 = getArrayF32FromWasm0(r0, r1).slice();\n                wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            }\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * The volume of this collider.\n     * @param {number} handle\n     * @returns {number}\n     */\n    coVolume(handle) {\n        const ret = wasm.rawcolliderset_coVolume(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @returns {Int32Array | undefined}\n     */\n    coVoxelData(handle) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawcolliderset_coVoxelData(retptr, this.__wbg_ptr, handle);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            let v1;\n            if (r0 !== 0) {\n                v1 = getArrayI32FromWasm0(r0, r1).slice();\n                wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            }\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} handle\n     * @returns {RawVector | undefined}\n     */\n    coVoxelSize(handle) {\n        const ret = wasm.rawcolliderset_coVoxelSize(this.__wbg_ptr, handle);\n        return ret === 0 ? undefined : RawVector.__wrap(ret);\n    }\n    /**\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    contains(handle) {\n        const ret = wasm.rawcolliderset_contains(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * @param {boolean} enabled\n     * @param {RawShape} shape\n     * @param {RawVector} translation\n     * @param {RawRotation} rotation\n     * @param {number} massPropsMode\n     * @param {number} mass\n     * @param {RawVector} centerOfMass\n     * @param {RawVector} principalAngularInertia\n     * @param {RawRotation} angularInertiaFrame\n     * @param {number} density\n     * @param {number} friction\n     * @param {number} restitution\n     * @param {number} frictionCombineRule\n     * @param {number} restitutionCombineRule\n     * @param {boolean} isSensor\n     * @param {number} collisionGroups\n     * @param {number} solverGroups\n     * @param {number} activeCollisionTypes\n     * @param {number} activeHooks\n     * @param {number} activeEvents\n     * @param {number} contactForceEventThreshold\n     * @param {number} contactSkin\n     * @param {boolean} hasParent\n     * @param {number} parent\n     * @param {RawRigidBodySet} bodies\n     * @returns {number | undefined}\n     */\n    createCollider(enabled, shape, translation, rotation, massPropsMode, mass, centerOfMass, principalAngularInertia, angularInertiaFrame, density, friction, restitution, frictionCombineRule, restitutionCombineRule, isSensor, collisionGroups, solverGroups, activeCollisionTypes, activeHooks, activeEvents, contactForceEventThreshold, contactSkin, hasParent, parent, bodies) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            _assertClass(shape, RawShape);\n            _assertClass(translation, RawVector);\n            _assertClass(rotation, RawRotation);\n            _assertClass(centerOfMass, RawVector);\n            _assertClass(principalAngularInertia, RawVector);\n            _assertClass(angularInertiaFrame, RawRotation);\n            _assertClass(bodies, RawRigidBodySet);\n            wasm.rawcolliderset_createCollider(retptr, this.__wbg_ptr, enabled, shape.__wbg_ptr, translation.__wbg_ptr, rotation.__wbg_ptr, massPropsMode, mass, centerOfMass.__wbg_ptr, principalAngularInertia.__wbg_ptr, angularInertiaFrame.__wbg_ptr, density, friction, restitution, frictionCombineRule, restitutionCombineRule, isSensor, collisionGroups, solverGroups, activeCollisionTypes, activeHooks, activeEvents, contactForceEventThreshold, contactSkin, hasParent, parent, bodies.__wbg_ptr);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r2 = getDataViewMemory0().getFloat64(retptr + 8 * 1, true);\n            return r0 === 0 ? undefined : r2;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {boolean} enabled\n     * @param {RawShape} shape\n     * @param {RawVector} translation\n     * @param {RawRotation} rotation\n     * @param {number} massPropsMode\n     * @param {number} mass\n     * @param {RawVector} centerOfMass\n     * @param {RawVector} principalAngularInertia\n     * @param {RawRotation} angularInertiaFrame\n     * @param {number} density\n     * @param {number} friction\n     * @param {number} restitution\n     * @param {number} frictionCombineRule\n     * @param {number} restitutionCombineRule\n     * @param {boolean} isSensor\n     * @param {number} collisionGroups\n     * @param {number} solverGroups\n     * @param {number} activeCollisionTypes\n     * @param {number} activeHooks\n     * @param {number} activeEvents\n     * @param {number} contactForceEventThreshold\n     * @param {number} contactSkin\n     * @param {RawSoftMeshBindingMode} bindingMode\n     * @param {Uint32Array} bindingParticles\n     * @param {number} bindingEps\n     * @param {boolean} bindingSelfContacts\n     * @param {number} parent\n     * @param {RawRigidBodySet} bodies\n     * @param {RawSoftBodySet} softBodies\n     * @returns {number | undefined}\n     */\n    createDeformableCollider(enabled, shape, translation, rotation, massPropsMode, mass, centerOfMass, principalAngularInertia, angularInertiaFrame, density, friction, restitution, frictionCombineRule, restitutionCombineRule, isSensor, collisionGroups, solverGroups, activeCollisionTypes, activeHooks, activeEvents, contactForceEventThreshold, contactSkin, bindingMode, bindingParticles, bindingEps, bindingSelfContacts, parent, bodies, softBodies) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            _assertClass(shape, RawShape);\n            _assertClass(translation, RawVector);\n            _assertClass(rotation, RawRotation);\n            _assertClass(centerOfMass, RawVector);\n            _assertClass(principalAngularInertia, RawVector);\n            _assertClass(angularInertiaFrame, RawRotation);\n            const ptr0 = passArray32ToWasm0(bindingParticles, wasm.__wbindgen_export3);\n            const len0 = WASM_VECTOR_LEN;\n            _assertClass(bodies, RawRigidBodySet);\n            _assertClass(softBodies, RawSoftBodySet);\n            wasm.rawcolliderset_createDeformableCollider(retptr, this.__wbg_ptr, enabled, shape.__wbg_ptr, translation.__wbg_ptr, rotation.__wbg_ptr, massPropsMode, mass, centerOfMass.__wbg_ptr, principalAngularInertia.__wbg_ptr, angularInertiaFrame.__wbg_ptr, density, friction, restitution, frictionCombineRule, restitutionCombineRule, isSensor, collisionGroups, solverGroups, activeCollisionTypes, activeHooks, activeEvents, contactForceEventThreshold, contactSkin, bindingMode, ptr0, len0, bindingEps, bindingSelfContacts, parent, bodies.__wbg_ptr, softBodies.__wbg_ptr);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r2 = getDataViewMemory0().getFloat64(retptr + 8 * 1, true);\n            return r0 === 0 ? undefined : r2;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * Applies the given JavaScript function to the integer handle of each collider managed by this collider set.\n     *\n     * # Parameters\n     * - `f(handle)`: the function to apply to the integer handle of each collider managed by this collider set. Called as `f(handle)`.\n     * @param {Function} f\n     */\n    forEachColliderHandle(f) {\n        try {\n            wasm.rawcolliderset_forEachColliderHandle(this.__wbg_ptr, addBorrowedObject(f));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * Checks if a collider with the given integer handle exists.\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    isHandleValid(handle) {\n        const ret = wasm.rawcolliderset_isHandleValid(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * @returns {number}\n     */\n    len() {\n        const ret = wasm.rawcolliderset_len(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    constructor() {\n        const ret = wasm.rawcolliderset_new();\n        this.__wbg_ptr = ret;\n        RawColliderSetFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n    /**\n     * Removes a collider from this set and wake-up the rigid-body it is attached to.\n     * @param {number} handle\n     * @param {RawIslandManager} islands\n     * @param {RawRigidBodySet} bodies\n     * @param {RawSoftBodySet} softBodies\n     * @param {boolean} wakeUp\n     */\n    remove(handle, islands, bodies, softBodies, wakeUp) {\n        _assertClass(islands, RawIslandManager);\n        _assertClass(bodies, RawRigidBodySet);\n        _assertClass(softBodies, RawSoftBodySet);\n        wasm.rawcolliderset_remove(this.__wbg_ptr, handle, islands.__wbg_ptr, bodies.__wbg_ptr, softBodies.__wbg_ptr, wakeUp);\n    }\n}\nif (Symbol.dispose) RawColliderSet.prototype[Symbol.dispose] = RawColliderSet.prototype.free;\n\nexport class RawColliderShapeCastHit {\n    static __wrap(ptr) {\n        const obj = Object.create(RawColliderShapeCastHit.prototype);\n        obj.__wbg_ptr = ptr;\n        RawColliderShapeCastHitFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawColliderShapeCastHitFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawcollidershapecasthit_free(ptr, 0);\n    }\n    /**\n     * @returns {number}\n     */\n    colliderHandle() {\n        const ret = wasm.rawcollidershapecasthit_colliderHandle(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @param {Float32Array} scratch_buffer\n     */\n    getComponents(scratch_buffer) {\n        try {\n            wasm.rawcollidershapecasthit_getComponents(this.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n}\nif (Symbol.dispose) RawColliderShapeCastHit.prototype[Symbol.dispose] = RawColliderShapeCastHit.prototype.free;\n\nexport class RawContactForceEvent {\n    static __wrap(ptr) {\n        const obj = Object.create(RawContactForceEvent.prototype);\n        obj.__wbg_ptr = ptr;\n        RawContactForceEventFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawContactForceEventFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawcontactforceevent_free(ptr, 0);\n    }\n    /**\n     * The first collider involved in the contact.\n     * @returns {number}\n     */\n    collider1() {\n        const ret = wasm.rawcontactforceevent_collider1(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * The second collider involved in the contact.\n     * @returns {number}\n     */\n    collider2() {\n        const ret = wasm.rawcontactforceevent_collider2(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * The world-space (unit) direction of the force with strongest magnitude.\n     * @param {Float32Array} scratch_buffer\n     */\n    max_force_direction(scratch_buffer) {\n        try {\n            wasm.rawcontactforceevent_max_force_direction(this.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * The magnitude of the largest force at a contact point of this contact pair.\n     * @returns {number}\n     */\n    max_force_magnitude() {\n        const ret = wasm.rawcontactforceevent_max_force_magnitude(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * The sum of all the forces between the two colliders.\n     * @param {Float32Array} scratch_buffer\n     */\n    total_force(scratch_buffer) {\n        try {\n            wasm.rawcontactforceevent_total_force(this.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * The sum of the magnitudes of each force between the two colliders.\n     *\n     * Note that this is **not** the same as the magnitude of `self.total_force`.\n     * Here we are summing the magnitude of all the forces, instead of taking\n     * the magnitude of their sum.\n     * @returns {number}\n     */\n    total_force_magnitude() {\n        const ret = wasm.rawcontactforceevent_total_force_magnitude(this.__wbg_ptr);\n        return ret;\n    }\n}\nif (Symbol.dispose) RawContactForceEvent.prototype[Symbol.dispose] = RawContactForceEvent.prototype.free;\n\nexport class RawContactManifold {\n    static __wrap(ptr) {\n        const obj = Object.create(RawContactManifold.prototype);\n        obj.__wbg_ptr = ptr;\n        RawContactManifoldFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawContactManifoldFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawcontactmanifold_free(ptr, 0);\n    }\n    /**\n     * @param {number} i\n     * @returns {number}\n     */\n    contact_dist(i) {\n        const ret = wasm.rawcontactmanifold_contact_dist(this.__wbg_ptr, i);\n        return ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number}\n     */\n    contact_fid1(i) {\n        const ret = wasm.rawcontactmanifold_contact_fid1(this.__wbg_ptr, i);\n        return ret >>> 0;\n    }\n    /**\n     * @param {number} i\n     * @returns {number}\n     */\n    contact_fid2(i) {\n        const ret = wasm.rawcontactmanifold_contact_fid2(this.__wbg_ptr, i);\n        return ret >>> 0;\n    }\n    /**\n     * @param {number} i\n     * @returns {number}\n     */\n    contact_impulse(i) {\n        const ret = wasm.rawcontactmanifold_contact_impulse(this.__wbg_ptr, i);\n        return ret;\n    }\n    /**\n     * @param {number} i\n     * @param {Float32Array} scratch_buffer\n     * @returns {boolean}\n     */\n    contact_local_p1(i, scratch_buffer) {\n        try {\n            const ret = wasm.rawcontactmanifold_contact_local_p1(this.__wbg_ptr, i, addBorrowedObject(scratch_buffer));\n            return ret !== 0;\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} i\n     * @param {Float32Array} scratch_buffer\n     * @returns {boolean}\n     */\n    contact_local_p2(i, scratch_buffer) {\n        try {\n            const ret = wasm.rawcontactmanifold_contact_local_p2(this.__wbg_ptr, i, addBorrowedObject(scratch_buffer));\n            return ret !== 0;\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} i\n     * @returns {number}\n     */\n    contact_tangent_impulse_x(i) {\n        const ret = wasm.rawcontactmanifold_contact_tangent_impulse_x(this.__wbg_ptr, i);\n        return ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number}\n     */\n    contact_tangent_impulse_y(i) {\n        const ret = wasm.rawcontactmanifold_contact_tangent_impulse_y(this.__wbg_ptr, i);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    friction() {\n        const ret = wasm.rawcontactmanifold_friction(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @param {Float32Array} scratch_buffer\n     */\n    local_n1(scratch_buffer) {\n        try {\n            wasm.rawcontactmanifold_local_n1(this.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {Float32Array} scratch_buffer\n     */\n    local_n2(scratch_buffer) {\n        try {\n            wasm.rawcontactmanifold_local_n2(this.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {Float32Array} scratch_buffer\n     */\n    normal(scratch_buffer) {\n        try {\n            wasm.rawcontactmanifold_normal(this.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @returns {number}\n     */\n    num_contacts() {\n        const ret = wasm.rawcontactmanifold_num_contacts(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @returns {number}\n     */\n    num_solver_contacts() {\n        const ret = wasm.rawcontactmanifold_num_solver_contacts(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @returns {number}\n     */\n    restitution() {\n        const ret = wasm.rawcontactmanifold_restitution(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number}\n     */\n    solver_contact_dist(i) {\n        const ret = wasm.rawcontactmanifold_solver_contact_dist(this.__wbg_ptr, i);\n        return ret;\n    }\n    /**\n     * @param {RawRigidBodySet} bodies\n     * @param {number} i\n     * @param {Float32Array} scratch_buffer\n     * @returns {boolean}\n     */\n    solver_contact_point(bodies, i, scratch_buffer) {\n        try {\n            _assertClass(bodies, RawRigidBodySet);\n            const ret = wasm.rawcontactmanifold_solver_contact_point(this.__wbg_ptr, bodies.__wbg_ptr, i, addBorrowedObject(scratch_buffer));\n            return ret !== 0;\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} i\n     * @param {Float32Array} scratch_buffer\n     */\n    solver_contact_tangent_velocity(i, scratch_buffer) {\n        try {\n            wasm.rawcontactmanifold_solver_contact_tangent_velocity(this.__wbg_ptr, i, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @returns {number}\n     */\n    subshape1() {\n        const ret = wasm.rawcontactmanifold_subshape1(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @returns {number}\n     */\n    subshape2() {\n        const ret = wasm.rawcontactmanifold_subshape2(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n}\nif (Symbol.dispose) RawContactManifold.prototype[Symbol.dispose] = RawContactManifold.prototype.free;\n\nexport class RawContactPair {\n    static __wrap(ptr) {\n        const obj = Object.create(RawContactPair.prototype);\n        obj.__wbg_ptr = ptr;\n        RawContactPairFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawContactPairFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawcontactpair_free(ptr, 0);\n    }\n    /**\n     * @returns {number}\n     */\n    collider1() {\n        const ret = wasm.rawcontactpair_collider1(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    collider2() {\n        const ret = wasm.rawcontactpair_collider2(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {RawContactManifold | undefined}\n     */\n    contactManifold(i) {\n        const ret = wasm.rawcontactpair_contactManifold(this.__wbg_ptr, i);\n        return ret === 0 ? undefined : RawContactManifold.__wrap(ret);\n    }\n    /**\n     * @returns {number}\n     */\n    numContactManifolds() {\n        const ret = wasm.rawcontactpair_numContactManifolds(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n}\nif (Symbol.dispose) RawContactPair.prototype[Symbol.dispose] = RawContactPair.prototype.free;\n\n/**\n * The vertex/index buffers of a convex polyhedron’s convex hull.\n */\nexport class RawConvexMeshData {\n    static __wrap(ptr) {\n        const obj = Object.create(RawConvexMeshData.prototype);\n        obj.__wbg_ptr = ptr;\n        RawConvexMeshDataFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawConvexMeshDataFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawconvexmeshdata_free(ptr, 0);\n    }\n    /**\n     * @returns {Uint32Array}\n     */\n    get indices() {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.__wbg_get_rawconvexmeshdata_indices(retptr, this.__wbg_ptr);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayU32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @returns {Float32Array}\n     */\n    get vertices() {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.__wbg_get_rawconvexmeshdata_vertices(retptr, this.__wbg_ptr);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayF32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {Uint32Array} arg0\n     */\n    set indices(arg0) {\n        const ptr0 = passArray32ToWasm0(arg0, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        wasm.__wbg_set_rawconvexmeshdata_indices(this.__wbg_ptr, ptr0, len0);\n    }\n    /**\n     * @param {Float32Array} arg0\n     */\n    set vertices(arg0) {\n        const ptr0 = passArrayF32ToWasm0(arg0, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        wasm.__wbg_set_rawconvexmeshdata_vertices(this.__wbg_ptr, ptr0, len0);\n    }\n}\nif (Symbol.dispose) RawConvexMeshData.prototype[Symbol.dispose] = RawConvexMeshData.prototype.free;\n\nexport class RawDebugRenderPipeline {\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawDebugRenderPipelineFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawdebugrenderpipeline_free(ptr, 0);\n    }\n    /**\n     * @returns {Float32Array}\n     */\n    colors() {\n        const ret = wasm.rawdebugrenderpipeline_colors(this.__wbg_ptr);\n        return takeObject(ret);\n    }\n    constructor() {\n        const ret = wasm.rawdebugrenderpipeline_new();\n        this.__wbg_ptr = ret;\n        RawDebugRenderPipelineFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n    /**\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @param {RawSoftBodySet} soft_bodies\n     * @param {RawImpulseJointSet} impulse_joints\n     * @param {RawMultibodyJointSet} multibody_joints\n     * @param {RawNarrowPhase} narrow_phase\n     * @param {number} filter_flags\n     * @param {Function} filter_predicate\n     */\n    render(bodies, colliders, soft_bodies, impulse_joints, multibody_joints, narrow_phase, filter_flags, filter_predicate) {\n        try {\n            _assertClass(bodies, RawRigidBodySet);\n            _assertClass(colliders, RawColliderSet);\n            _assertClass(soft_bodies, RawSoftBodySet);\n            _assertClass(impulse_joints, RawImpulseJointSet);\n            _assertClass(multibody_joints, RawMultibodyJointSet);\n            _assertClass(narrow_phase, RawNarrowPhase);\n            wasm.rawdebugrenderpipeline_render(this.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr, soft_bodies.__wbg_ptr, impulse_joints.__wbg_ptr, multibody_joints.__wbg_ptr, narrow_phase.__wbg_ptr, filter_flags, addBorrowedObject(filter_predicate));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @returns {Float32Array}\n     */\n    vertices() {\n        const ret = wasm.rawdebugrenderpipeline_vertices(this.__wbg_ptr);\n        return takeObject(ret);\n    }\n}\nif (Symbol.dispose) RawDebugRenderPipeline.prototype[Symbol.dispose] = RawDebugRenderPipeline.prototype.free;\n\nexport class RawDeserializedWorld {\n    static __wrap(ptr) {\n        const obj = Object.create(RawDeserializedWorld.prototype);\n        obj.__wbg_ptr = ptr;\n        RawDeserializedWorldFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawDeserializedWorldFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawdeserializedworld_free(ptr, 0);\n    }\n    /**\n     * @returns {RawRigidBodySet | undefined}\n     */\n    takeBodies() {\n        const ret = wasm.rawdeserializedworld_takeBodies(this.__wbg_ptr);\n        return ret === 0 ? undefined : RawRigidBodySet.__wrap(ret);\n    }\n    /**\n     * @returns {RawBroadPhase | undefined}\n     */\n    takeBroadPhase() {\n        const ret = wasm.rawdeserializedworld_takeBroadPhase(this.__wbg_ptr);\n        return ret === 0 ? undefined : RawBroadPhase.__wrap(ret);\n    }\n    /**\n     * @returns {RawColliderSet | undefined}\n     */\n    takeColliders() {\n        const ret = wasm.rawdeserializedworld_takeColliders(this.__wbg_ptr);\n        return ret === 0 ? undefined : RawColliderSet.__wrap(ret);\n    }\n    /**\n     * @returns {RawVector | undefined}\n     */\n    takeGravity() {\n        const ret = wasm.rawdeserializedworld_takeGravity(this.__wbg_ptr);\n        return ret === 0 ? undefined : RawVector.__wrap(ret);\n    }\n    /**\n     * @returns {RawImpulseJointSet | undefined}\n     */\n    takeImpulseJoints() {\n        const ret = wasm.rawdeserializedworld_takeImpulseJoints(this.__wbg_ptr);\n        return ret === 0 ? undefined : RawImpulseJointSet.__wrap(ret);\n    }\n    /**\n     * @returns {RawIntegrationParameters | undefined}\n     */\n    takeIntegrationParameters() {\n        const ret = wasm.rawdeserializedworld_takeIntegrationParameters(this.__wbg_ptr);\n        return ret === 0 ? undefined : RawIntegrationParameters.__wrap(ret);\n    }\n    /**\n     * @returns {RawIslandManager | undefined}\n     */\n    takeIslandManager() {\n        const ret = wasm.rawdeserializedworld_takeIslandManager(this.__wbg_ptr);\n        return ret === 0 ? undefined : RawIslandManager.__wrap(ret);\n    }\n    /**\n     * @returns {RawMultibodyJointSet | undefined}\n     */\n    takeMultibodyJoints() {\n        const ret = wasm.rawdeserializedworld_takeMultibodyJoints(this.__wbg_ptr);\n        return ret === 0 ? undefined : RawMultibodyJointSet.__wrap(ret);\n    }\n    /**\n     * @returns {RawNarrowPhase | undefined}\n     */\n    takeNarrowPhase() {\n        const ret = wasm.rawdeserializedworld_takeNarrowPhase(this.__wbg_ptr);\n        return ret === 0 ? undefined : RawNarrowPhase.__wrap(ret);\n    }\n    /**\n     * @returns {RawSoftBodySet | undefined}\n     */\n    takeSoftBodies() {\n        const ret = wasm.rawdeserializedworld_takeSoftBodies(this.__wbg_ptr);\n        return ret === 0 ? undefined : RawSoftBodySet.__wrap(ret);\n    }\n}\nif (Symbol.dispose) RawDeserializedWorld.prototype[Symbol.dispose] = RawDeserializedWorld.prototype.free;\n\nexport class RawDynamicRayCastVehicleController {\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawDynamicRayCastVehicleControllerFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawdynamicraycastvehiclecontroller_free(ptr, 0);\n    }\n    /**\n     * @param {RawVector} chassis_connection_cs\n     * @param {RawVector} direction_cs\n     * @param {RawVector} axle_cs\n     * @param {number} suspension_rest_length\n     * @param {number} radius\n     */\n    add_wheel(chassis_connection_cs, direction_cs, axle_cs, suspension_rest_length, radius) {\n        _assertClass(chassis_connection_cs, RawVector);\n        _assertClass(direction_cs, RawVector);\n        _assertClass(axle_cs, RawVector);\n        wasm.rawdynamicraycastvehiclecontroller_add_wheel(this.__wbg_ptr, chassis_connection_cs.__wbg_ptr, direction_cs.__wbg_ptr, axle_cs.__wbg_ptr, suspension_rest_length, radius);\n    }\n    /**\n     * @returns {number}\n     */\n    chassis() {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_chassis(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    current_vehicle_speed() {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_current_vehicle_speed(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    index_forward_axis() {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_index_forward_axis(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @returns {number}\n     */\n    index_up_axis() {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_index_up_axis(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @param {number} chassis\n     */\n    constructor(chassis) {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_new(chassis);\n        this.__wbg_ptr = ret;\n        RawDynamicRayCastVehicleControllerFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n    /**\n     * @returns {number}\n     */\n    num_wheels() {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_num_wheels(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @param {number} axis\n     */\n    set_index_forward_axis(axis) {\n        wasm.rawdynamicraycastvehiclecontroller_set_index_forward_axis(this.__wbg_ptr, axis);\n    }\n    /**\n     * @param {number} axis\n     */\n    set_index_up_axis(axis) {\n        wasm.rawdynamicraycastvehiclecontroller_set_index_up_axis(this.__wbg_ptr, axis);\n    }\n    /**\n     * @param {number} i\n     * @param {RawVector} value\n     */\n    set_wheel_axle_cs(i, value) {\n        _assertClass(value, RawVector);\n        wasm.rawdynamicraycastvehiclecontroller_set_wheel_axle_cs(this.__wbg_ptr, i, value.__wbg_ptr);\n    }\n    /**\n     * @param {number} i\n     * @param {number} value\n     */\n    set_wheel_brake(i, value) {\n        wasm.rawdynamicraycastvehiclecontroller_set_wheel_brake(this.__wbg_ptr, i, value);\n    }\n    /**\n     * @param {number} i\n     * @param {RawVector} value\n     */\n    set_wheel_chassis_connection_point_cs(i, value) {\n        _assertClass(value, RawVector);\n        wasm.rawdynamicraycastvehiclecontroller_set_wheel_chassis_connection_point_cs(this.__wbg_ptr, i, value.__wbg_ptr);\n    }\n    /**\n     * @param {number} i\n     * @param {RawVector} value\n     */\n    set_wheel_direction_cs(i, value) {\n        _assertClass(value, RawVector);\n        wasm.rawdynamicraycastvehiclecontroller_set_wheel_direction_cs(this.__wbg_ptr, i, value.__wbg_ptr);\n    }\n    /**\n     * @param {number} i\n     * @param {number} value\n     */\n    set_wheel_engine_force(i, value) {\n        wasm.rawdynamicraycastvehiclecontroller_set_wheel_engine_force(this.__wbg_ptr, i, value);\n    }\n    /**\n     * @param {number} i\n     * @param {number} value\n     */\n    set_wheel_friction_slip(i, value) {\n        wasm.rawdynamicraycastvehiclecontroller_set_wheel_friction_slip(this.__wbg_ptr, i, value);\n    }\n    /**\n     * @param {number} i\n     * @param {number} value\n     */\n    set_wheel_max_suspension_force(i, value) {\n        wasm.rawdynamicraycastvehiclecontroller_set_wheel_max_suspension_force(this.__wbg_ptr, i, value);\n    }\n    /**\n     * @param {number} i\n     * @param {number} value\n     */\n    set_wheel_max_suspension_travel(i, value) {\n        wasm.rawdynamicraycastvehiclecontroller_set_wheel_max_suspension_travel(this.__wbg_ptr, i, value);\n    }\n    /**\n     * @param {number} i\n     * @param {number} value\n     */\n    set_wheel_radius(i, value) {\n        wasm.rawdynamicraycastvehiclecontroller_set_wheel_radius(this.__wbg_ptr, i, value);\n    }\n    /**\n     * @param {number} i\n     * @param {number} stiffness\n     */\n    set_wheel_side_friction_stiffness(i, stiffness) {\n        wasm.rawdynamicraycastvehiclecontroller_set_wheel_side_friction_stiffness(this.__wbg_ptr, i, stiffness);\n    }\n    /**\n     * @param {number} i\n     * @param {number} value\n     */\n    set_wheel_steering(i, value) {\n        wasm.rawdynamicraycastvehiclecontroller_set_wheel_steering(this.__wbg_ptr, i, value);\n    }\n    /**\n     * @param {number} i\n     * @param {number} value\n     */\n    set_wheel_suspension_compression(i, value) {\n        wasm.rawdynamicraycastvehiclecontroller_set_wheel_suspension_compression(this.__wbg_ptr, i, value);\n    }\n    /**\n     * @param {number} i\n     * @param {number} value\n     */\n    set_wheel_suspension_relaxation(i, value) {\n        wasm.rawdynamicraycastvehiclecontroller_set_wheel_suspension_relaxation(this.__wbg_ptr, i, value);\n    }\n    /**\n     * @param {number} i\n     * @param {number} value\n     */\n    set_wheel_suspension_rest_length(i, value) {\n        wasm.rawdynamicraycastvehiclecontroller_set_wheel_suspension_rest_length(this.__wbg_ptr, i, value);\n    }\n    /**\n     * @param {number} i\n     * @param {number} value\n     */\n    set_wheel_suspension_stiffness(i, value) {\n        wasm.rawdynamicraycastvehiclecontroller_set_wheel_suspension_stiffness(this.__wbg_ptr, i, value);\n    }\n    /**\n     * @param {number} dt\n     * @param {RawBroadPhase} broad_phase\n     * @param {RawNarrowPhase} narrow_phase\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @param {number} filter_flags\n     * @param {number | null | undefined} filter_groups\n     * @param {Function} filter_predicate\n     */\n    update_vehicle(dt, broad_phase, narrow_phase, bodies, colliders, filter_flags, filter_groups, filter_predicate) {\n        try {\n            _assertClass(broad_phase, RawBroadPhase);\n            _assertClass(narrow_phase, RawNarrowPhase);\n            _assertClass(bodies, RawRigidBodySet);\n            _assertClass(colliders, RawColliderSet);\n            wasm.rawdynamicraycastvehiclecontroller_update_vehicle(this.__wbg_ptr, dt, broad_phase.__wbg_ptr, narrow_phase.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr, filter_flags, isLikeNone(filter_groups) ? Number.MAX_SAFE_INTEGER : (filter_groups) >>> 0, addBorrowedObject(filter_predicate));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} i\n     * @param {Float32Array} scratch_buffer\n     * @returns {boolean}\n     */\n    wheel_axle_cs(i, scratch_buffer) {\n        try {\n            const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_axle_cs(this.__wbg_ptr, i, addBorrowedObject(scratch_buffer));\n            return ret !== 0;\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    wheel_brake(i) {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_brake(this.__wbg_ptr, i);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} i\n     * @param {Float32Array} scratch_buffer\n     * @returns {boolean}\n     */\n    wheel_chassis_connection_point_cs(i, scratch_buffer) {\n        try {\n            const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_chassis_connection_point_cs(this.__wbg_ptr, i, addBorrowedObject(scratch_buffer));\n            return ret !== 0;\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} i\n     * @param {Float32Array} scratch_buffer\n     * @returns {boolean}\n     */\n    wheel_contact_normal_ws(i, scratch_buffer) {\n        try {\n            const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_contact_normal_ws(this.__wbg_ptr, i, addBorrowedObject(scratch_buffer));\n            return ret !== 0;\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} i\n     * @param {Float32Array} scratch_buffer\n     * @returns {boolean}\n     */\n    wheel_contact_point_ws(i, scratch_buffer) {\n        try {\n            const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_contact_point_ws(this.__wbg_ptr, i, addBorrowedObject(scratch_buffer));\n            return ret !== 0;\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} i\n     * @param {Float32Array} scratch_buffer\n     * @returns {boolean}\n     */\n    wheel_direction_cs(i, scratch_buffer) {\n        try {\n            const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_direction_cs(this.__wbg_ptr, i, addBorrowedObject(scratch_buffer));\n            return ret !== 0;\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    wheel_engine_force(i) {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_engine_force(this.__wbg_ptr, i);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    wheel_forward_impulse(i) {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_forward_impulse(this.__wbg_ptr, i);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    wheel_friction_slip(i) {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_friction_slip(this.__wbg_ptr, i);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    wheel_ground_object(i) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawdynamicraycastvehiclecontroller_wheel_ground_object(retptr, this.__wbg_ptr, i);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r2 = getDataViewMemory0().getFloat64(retptr + 8 * 1, true);\n            return r0 === 0 ? undefined : r2;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} i\n     * @param {Float32Array} scratch_buffer\n     * @returns {boolean}\n     */\n    wheel_hard_point_ws(i, scratch_buffer) {\n        try {\n            const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_hard_point_ws(this.__wbg_ptr, i, addBorrowedObject(scratch_buffer));\n            return ret !== 0;\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} i\n     * @returns {boolean}\n     */\n    wheel_is_in_contact(i) {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_is_in_contact(this.__wbg_ptr, i);\n        return ret !== 0;\n    }\n    /**\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    wheel_max_suspension_force(i) {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_max_suspension_force(this.__wbg_ptr, i);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    wheel_max_suspension_travel(i) {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_max_suspension_travel(this.__wbg_ptr, i);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    wheel_radius(i) {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_radius(this.__wbg_ptr, i);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    wheel_rotation(i) {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_rotation(this.__wbg_ptr, i);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    wheel_side_friction_stiffness(i) {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_side_friction_stiffness(this.__wbg_ptr, i);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    wheel_side_impulse(i) {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_side_impulse(this.__wbg_ptr, i);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    wheel_steering(i) {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_steering(this.__wbg_ptr, i);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    wheel_suspension_compression(i) {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_suspension_compression(this.__wbg_ptr, i);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    wheel_suspension_force(i) {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_suspension_force(this.__wbg_ptr, i);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    wheel_suspension_length(i) {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_suspension_length(this.__wbg_ptr, i);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    wheel_suspension_relaxation(i) {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_suspension_relaxation(this.__wbg_ptr, i);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    wheel_suspension_rest_length(i) {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_suspension_rest_length(this.__wbg_ptr, i);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    wheel_suspension_stiffness(i) {\n        const ret = wasm.rawdynamicraycastvehiclecontroller_wheel_suspension_stiffness(this.__wbg_ptr, i);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n}\nif (Symbol.dispose) RawDynamicRayCastVehicleController.prototype[Symbol.dispose] = RawDynamicRayCastVehicleController.prototype.free;\n\n/**\n * A structure responsible for collecting events generated\n * by the physics engine.\n */\nexport class RawEventQueue {\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawEventQueueFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_raweventqueue_free(ptr, 0);\n    }\n    /**\n     * Removes all events contained by this collector.\n     */\n    clear() {\n        wasm.raweventqueue_clear(this.__wbg_ptr);\n    }\n    /**\n     * Applies the given javascript closure on each collision event of this collector, then clear\n     * the internal collision event buffer.\n     *\n     * # Parameters\n     * - `f(handle1, handle2, started)`:  JavaScript closure applied to each collision event. The\n     * closure should take three arguments: two integers representing the handles of the colliders\n     * involved in the collision, and a boolean indicating if the collision started (true) or stopped\n     * (false).\n     * @param {Function} f\n     */\n    drainCollisionEvents(f) {\n        try {\n            wasm.raweventqueue_drainCollisionEvents(this.__wbg_ptr, addBorrowedObject(f));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {Function} f\n     */\n    drainContactForceEvents(f) {\n        try {\n            wasm.raweventqueue_drainContactForceEvents(this.__wbg_ptr, addBorrowedObject(f));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * Applies the given javascript closure on each soft-body tear event of this collector,\n     * then clears the internal tear event buffer.\n     * @param {Function} f\n     */\n    drainSoftBodyTearEvents(f) {\n        try {\n            wasm.raweventqueue_drainSoftBodyTearEvents(this.__wbg_ptr, addBorrowedObject(f));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * Creates a new event collector.\n     *\n     * # Parameters\n     * - `autoDrain`: setting this to `true` is strongly recommended. If true, the collector will\n     * be automatically drained before each `world.step(collector)`. If false, the collector will\n     * keep all events in memory unless it is manually drained/cleared; this may lead to unbounded use of\n     * RAM if no drain is performed.\n     * @param {boolean} autoDrain\n     */\n    constructor(autoDrain) {\n        const ret = wasm.raweventqueue_new(autoDrain);\n        this.__wbg_ptr = ret;\n        RawEventQueueFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n}\nif (Symbol.dispose) RawEventQueue.prototype[Symbol.dispose] = RawEventQueue.prototype.free;\n\n/**\n * @enum {0 | 1 | 2 | 3}\n */\nexport const RawFeatureType = Object.freeze({\n    Vertex: 0, \"0\": \"Vertex\",\n    Edge: 1, \"1\": \"Edge\",\n    Face: 2, \"2\": \"Face\",\n    Unknown: 3, \"3\": \"Unknown\",\n});\n\nexport class RawGenericJoint {\n    static __wrap(ptr) {\n        const obj = Object.create(RawGenericJoint.prototype);\n        obj.__wbg_ptr = ptr;\n        RawGenericJointFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawGenericJointFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawgenericjoint_free(ptr, 0);\n    }\n    /**\n     * Creates a new joint descriptor that builds a Fixed joint.\n     *\n     * A fixed joint removes all the degrees of freedom between the affected bodies.\n     * @param {RawVector} anchor1\n     * @param {RawRotation} axes1\n     * @param {RawVector} anchor2\n     * @param {RawRotation} axes2\n     * @returns {RawGenericJoint}\n     */\n    static fixed(anchor1, axes1, anchor2, axes2) {\n        _assertClass(anchor1, RawVector);\n        _assertClass(axes1, RawRotation);\n        _assertClass(anchor2, RawVector);\n        _assertClass(axes2, RawRotation);\n        const ret = wasm.rawgenericjoint_fixed(anchor1.__wbg_ptr, axes1.__wbg_ptr, anchor2.__wbg_ptr, axes2.__wbg_ptr);\n        return RawGenericJoint.__wrap(ret);\n    }\n    /**\n     * Creates a new joint descriptor that builds generic joints.\n     *\n     * Generic joints allow arbitrary axes of freedom to be selected\n     * for the joint from the available 6 degrees of freedom.\n     * @param {RawVector} anchor1\n     * @param {RawVector} anchor2\n     * @param {RawVector} axis\n     * @param {number} lockedAxes\n     * @returns {RawGenericJoint | undefined}\n     */\n    static generic(anchor1, anchor2, axis, lockedAxes) {\n        _assertClass(anchor1, RawVector);\n        _assertClass(anchor2, RawVector);\n        _assertClass(axis, RawVector);\n        const ret = wasm.rawgenericjoint_generic(anchor1.__wbg_ptr, anchor2.__wbg_ptr, axis.__wbg_ptr, lockedAxes);\n        return ret === 0 ? undefined : RawGenericJoint.__wrap(ret);\n    }\n    /**\n     * Creates a new joint descriptor that builds a Prismatic joint.\n     *\n     * A prismatic joint removes all the degrees of freedom between the\n     * affected bodies, except for the translation along one axis.\n     *\n     * Returns `None` if any of the provided axes cannot be normalized.\n     * @param {RawVector} anchor1\n     * @param {RawVector} anchor2\n     * @param {RawVector} axis\n     * @param {boolean} limitsEnabled\n     * @param {number} limitsMin\n     * @param {number} limitsMax\n     * @returns {RawGenericJoint | undefined}\n     */\n    static prismatic(anchor1, anchor2, axis, limitsEnabled, limitsMin, limitsMax) {\n        _assertClass(anchor1, RawVector);\n        _assertClass(anchor2, RawVector);\n        _assertClass(axis, RawVector);\n        const ret = wasm.rawgenericjoint_prismatic(anchor1.__wbg_ptr, anchor2.__wbg_ptr, axis.__wbg_ptr, limitsEnabled, limitsMin, limitsMax);\n        return ret === 0 ? undefined : RawGenericJoint.__wrap(ret);\n    }\n    /**\n     * Create a new joint descriptor that builds Revolute joints with\n     * independent local axes for each attached rigid-body.\n     *\n     * This is equivalent to a revolute generic joint with all linear axes\n     * locked and only angular X free, but it preserves the local hinge axis\n     * on each body instead of assuming they are identical.\n     * @param {RawVector} anchor1\n     * @param {RawVector} anchor2\n     * @param {RawVector} axis1\n     * @param {RawVector} axis2\n     * @returns {RawGenericJoint | undefined}\n     */\n    static revoluteWithAxes(anchor1, anchor2, axis1, axis2) {\n        _assertClass(anchor1, RawVector);\n        _assertClass(anchor2, RawVector);\n        _assertClass(axis1, RawVector);\n        _assertClass(axis2, RawVector);\n        const ret = wasm.rawgenericjoint_revoluteWithAxes(anchor1.__wbg_ptr, anchor2.__wbg_ptr, axis1.__wbg_ptr, axis2.__wbg_ptr);\n        return ret === 0 ? undefined : RawGenericJoint.__wrap(ret);\n    }\n    /**\n     * Create a new joint descriptor that builds Revolute joints.\n     *\n     * A revolute joint removes all degrees of freedom between the affected\n     * bodies except for the rotation along one axis.\n     * @param {RawVector} anchor1\n     * @param {RawVector} anchor2\n     * @param {RawVector} axis\n     * @returns {RawGenericJoint | undefined}\n     */\n    static revolute(anchor1, anchor2, axis) {\n        _assertClass(anchor1, RawVector);\n        _assertClass(anchor2, RawVector);\n        _assertClass(axis, RawVector);\n        const ret = wasm.rawgenericjoint_revolute(anchor1.__wbg_ptr, anchor2.__wbg_ptr, axis.__wbg_ptr);\n        return ret === 0 ? undefined : RawGenericJoint.__wrap(ret);\n    }\n    /**\n     * @param {number} length\n     * @param {RawVector} anchor1\n     * @param {RawVector} anchor2\n     * @returns {RawGenericJoint}\n     */\n    static rope(length, anchor1, anchor2) {\n        _assertClass(anchor1, RawVector);\n        _assertClass(anchor2, RawVector);\n        const ret = wasm.rawgenericjoint_rope(length, anchor1.__wbg_ptr, anchor2.__wbg_ptr);\n        return RawGenericJoint.__wrap(ret);\n    }\n    /**\n     * Create a new joint descriptor that builds spherical joints.\n     *\n     * A spherical joints allows three relative rotational degrees of freedom\n     * by preventing any relative translation between the anchors of the\n     * two attached rigid-bodies.\n     * @param {RawVector} anchor1\n     * @param {RawVector} anchor2\n     * @returns {RawGenericJoint}\n     */\n    static spherical(anchor1, anchor2) {\n        _assertClass(anchor1, RawVector);\n        _assertClass(anchor2, RawVector);\n        const ret = wasm.rawgenericjoint_spherical(anchor1.__wbg_ptr, anchor2.__wbg_ptr);\n        return RawGenericJoint.__wrap(ret);\n    }\n    /**\n     * @param {number} rest_length\n     * @param {number} stiffness\n     * @param {number} damping\n     * @param {RawVector} anchor1\n     * @param {RawVector} anchor2\n     * @returns {RawGenericJoint}\n     */\n    static spring(rest_length, stiffness, damping, anchor1, anchor2) {\n        _assertClass(anchor1, RawVector);\n        _assertClass(anchor2, RawVector);\n        const ret = wasm.rawgenericjoint_spring(rest_length, stiffness, damping, anchor1.__wbg_ptr, anchor2.__wbg_ptr);\n        return RawGenericJoint.__wrap(ret);\n    }\n}\nif (Symbol.dispose) RawGenericJoint.prototype[Symbol.dispose] = RawGenericJoint.prototype.free;\n\nexport class RawImpulseJointSet {\n    static __wrap(ptr) {\n        const obj = Object.create(RawImpulseJointSet.prototype);\n        obj.__wbg_ptr = ptr;\n        RawImpulseJointSetFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawImpulseJointSetFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawimpulsejointset_free(ptr, 0);\n    }\n    /**\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    contains(handle) {\n        const ret = wasm.rawimpulsejointset_contains(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * @param {RawGenericJoint} params\n     * @param {number} parent1\n     * @param {number} parent2\n     * @param {boolean} wake_up\n     * @returns {number}\n     */\n    createJoint(params, parent1, parent2, wake_up) {\n        _assertClass(params, RawGenericJoint);\n        const ret = wasm.rawimpulsejointset_createJoint(this.__wbg_ptr, params.__wbg_ptr, parent1, parent2, wake_up);\n        return ret;\n    }\n    /**\n     * Applies the given JavaScript function to the integer handle of each joint attached to the given rigid-body.\n     *\n     * # Parameters\n     * - `f(handle)`: the function to apply to the integer handle of each joint attached to the rigid-body. Called as `f(collider)`.\n     * @param {number} body\n     * @param {Function} f\n     */\n    forEachJointAttachedToRigidBody(body, f) {\n        try {\n            wasm.rawimpulsejointset_forEachJointAttachedToRigidBody(this.__wbg_ptr, body, addBorrowedObject(f));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * Applies the given JavaScript function to the integer handle of each joint managed by this physics world.\n     *\n     * # Parameters\n     * - `f(handle)`: the function to apply to the integer handle of each joint managed by this set. Called as `f(collider)`.\n     * @param {Function} f\n     */\n    forEachJointHandle(f) {\n        try {\n            wasm.rawimpulsejointset_forEachJointHandle(this.__wbg_ptr, addBorrowedObject(f));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * The position of the second anchor of this joint.\n     *\n     * The second anchor gives the position of the points application point on the\n     * local frame of the second rigid-body it is attached to.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    jointAnchor1(handle, scratch_buffer) {\n        try {\n            wasm.rawimpulsejointset_jointAnchor1(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * The position of the second anchor of this joint.\n     *\n     * The second anchor gives the position of the points application point on the\n     * local frame of the second rigid-body it is attached to.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    jointAnchor2(handle, scratch_buffer) {\n        try {\n            wasm.rawimpulsejointset_jointAnchor2(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * The unique integer identifier of the first rigid-body this joint it attached to.\n     * @param {number} handle\n     * @returns {number}\n     */\n    jointBodyHandle1(handle) {\n        const ret = wasm.rawimpulsejointset_jointBodyHandle1(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * The unique integer identifier of the second rigid-body this joint is attached to.\n     * @param {number} handle\n     * @returns {number}\n     */\n    jointBodyHandle2(handle) {\n        const ret = wasm.rawimpulsejointset_jointBodyHandle2(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {RawJointAxis} axis\n     * @param {RawMotorModel} model\n     */\n    jointConfigureMotorModel(handle, axis, model) {\n        wasm.rawimpulsejointset_jointConfigureMotorModel(this.__wbg_ptr, handle, axis, model);\n    }\n    /**\n     * @param {number} handle\n     * @param {RawJointAxis} axis\n     * @param {number} targetPos\n     * @param {number} stiffness\n     * @param {number} damping\n     */\n    jointConfigureMotorPosition(handle, axis, targetPos, stiffness, damping) {\n        wasm.rawimpulsejointset_jointConfigureMotorPosition(this.__wbg_ptr, handle, axis, targetPos, stiffness, damping);\n    }\n    /**\n     * @param {number} handle\n     * @param {RawJointAxis} axis\n     * @param {number} targetVel\n     * @param {number} factor\n     */\n    jointConfigureMotorVelocity(handle, axis, targetVel, factor) {\n        wasm.rawimpulsejointset_jointConfigureMotorVelocity(this.__wbg_ptr, handle, axis, targetVel, factor);\n    }\n    /**\n     * @param {number} handle\n     * @param {RawJointAxis} axis\n     * @param {number} targetPos\n     * @param {number} targetVel\n     * @param {number} stiffness\n     * @param {number} damping\n     */\n    jointConfigureMotor(handle, axis, targetPos, targetVel, stiffness, damping) {\n        wasm.rawimpulsejointset_jointConfigureMotor(this.__wbg_ptr, handle, axis, targetPos, targetVel, stiffness, damping);\n    }\n    /**\n     * Are contacts between the rigid-bodies attached by this joint enabled?\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    jointContactsEnabled(handle) {\n        const ret = wasm.rawimpulsejointset_jointContactsEnabled(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * The angular part of the joint’s local frame relative to the first rigid-body it is attached to.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    jointFrameX1(handle, scratch_buffer) {\n        try {\n            wasm.rawimpulsejointset_jointFrameX1(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * The angular part of the joint’s local frame relative to the second rigid-body it is attached to.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    jointFrameX2(handle, scratch_buffer) {\n        try {\n            wasm.rawimpulsejointset_jointFrameX2(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * Are the limits for this joint enabled?\n     * @param {number} handle\n     * @param {RawJointAxis} axis\n     * @returns {boolean}\n     */\n    jointLimitsEnabled(handle, axis) {\n        const ret = wasm.rawimpulsejointset_jointLimitsEnabled(this.__wbg_ptr, handle, axis);\n        return ret !== 0;\n    }\n    /**\n     * If this is a prismatic joint, returns its upper limit.\n     * @param {number} handle\n     * @param {RawJointAxis} axis\n     * @returns {number}\n     */\n    jointLimitsMax(handle, axis) {\n        const ret = wasm.rawimpulsejointset_jointLimitsMax(this.__wbg_ptr, handle, axis);\n        return ret;\n    }\n    /**\n     * Return the lower limit along the given joint axis.\n     * @param {number} handle\n     * @param {RawJointAxis} axis\n     * @returns {number}\n     */\n    jointLimitsMin(handle, axis) {\n        const ret = wasm.rawimpulsejointset_jointLimitsMin(this.__wbg_ptr, handle, axis);\n        return ret;\n    }\n    /**\n     * Sets the position of the first local anchor\n     * @param {number} handle\n     * @param {RawVector} newPos\n     */\n    jointSetAnchor1(handle, newPos) {\n        _assertClass(newPos, RawVector);\n        wasm.rawimpulsejointset_jointSetAnchor1(this.__wbg_ptr, handle, newPos.__wbg_ptr);\n    }\n    /**\n     * Sets the position of the second local anchor\n     * @param {number} handle\n     * @param {RawVector} newPos\n     */\n    jointSetAnchor2(handle, newPos) {\n        _assertClass(newPos, RawVector);\n        wasm.rawimpulsejointset_jointSetAnchor2(this.__wbg_ptr, handle, newPos.__wbg_ptr);\n    }\n    /**\n     * Sets whether contacts are enabled between the rigid-bodies attached by this joint.\n     * @param {number} handle\n     * @param {boolean} enabled\n     */\n    jointSetContactsEnabled(handle, enabled) {\n        wasm.rawimpulsejointset_jointSetContactsEnabled(this.__wbg_ptr, handle, enabled);\n    }\n    /**\n     * Sets the angular part of the joint's local frame relative to the first rigid-body.\n     * @param {number} handle\n     * @param {RawRotation} newRot\n     */\n    jointSetFrameX1(handle, newRot) {\n        _assertClass(newRot, RawRotation);\n        wasm.rawimpulsejointset_jointSetFrameX1(this.__wbg_ptr, handle, newRot.__wbg_ptr);\n    }\n    /**\n     * Sets the angular part of the joint's local frame relative to the second rigid-body.\n     * @param {number} handle\n     * @param {RawRotation} newRot\n     */\n    jointSetFrameX2(handle, newRot) {\n        _assertClass(newRot, RawRotation);\n        wasm.rawimpulsejointset_jointSetFrameX2(this.__wbg_ptr, handle, newRot.__wbg_ptr);\n    }\n    /**\n     * Enables and sets the joint limits\n     * @param {number} handle\n     * @param {RawJointAxis} axis\n     * @param {number} min\n     * @param {number} max\n     */\n    jointSetLimits(handle, axis, min, max) {\n        wasm.rawimpulsejointset_jointSetLimits(this.__wbg_ptr, handle, axis, min, max);\n    }\n    /**\n     * Sets the full local frame (anchor + rotation) for the first rigid-body attachment.\n     * @param {number} handle\n     * @param {RawVector} anchor\n     * @param {RawRotation} rot\n     */\n    jointSetLocalFrame1(handle, anchor, rot) {\n        _assertClass(anchor, RawVector);\n        _assertClass(rot, RawRotation);\n        wasm.rawimpulsejointset_jointSetLocalFrame1(this.__wbg_ptr, handle, anchor.__wbg_ptr, rot.__wbg_ptr);\n    }\n    /**\n     * Sets the full local frame (anchor + rotation) for the second rigid-body attachment.\n     * @param {number} handle\n     * @param {RawVector} anchor\n     * @param {RawRotation} rot\n     */\n    jointSetLocalFrame2(handle, anchor, rot) {\n        _assertClass(anchor, RawVector);\n        _assertClass(rot, RawRotation);\n        wasm.rawimpulsejointset_jointSetLocalFrame2(this.__wbg_ptr, handle, anchor.__wbg_ptr, rot.__wbg_ptr);\n    }\n    /**\n     * @param {number} handle\n     * @param {RawJointAxis} axis\n     * @param {number} maxForce\n     */\n    jointSetMotorMaxForce(handle, axis, maxForce) {\n        wasm.rawimpulsejointset_jointSetMotorMaxForce(this.__wbg_ptr, handle, axis, maxForce);\n    }\n    /**\n     * The type of this joint.\n     * @param {number} handle\n     * @returns {RawJointType}\n     */\n    jointType(handle) {\n        const ret = wasm.rawimpulsejointset_jointType(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    len() {\n        const ret = wasm.rawimpulsejointset_len(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    constructor() {\n        const ret = wasm.rawimpulsejointset_new();\n        this.__wbg_ptr = ret;\n        RawImpulseJointSetFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n    /**\n     * @param {number} handle\n     * @param {boolean} wakeUp\n     */\n    remove(handle, wakeUp) {\n        wasm.rawimpulsejointset_remove(this.__wbg_ptr, handle, wakeUp);\n    }\n}\nif (Symbol.dispose) RawImpulseJointSet.prototype[Symbol.dispose] = RawImpulseJointSet.prototype.free;\n\nexport class RawIntegrationParameters {\n    static __wrap(ptr) {\n        const obj = Object.create(RawIntegrationParameters.prototype);\n        obj.__wbg_ptr = ptr;\n        RawIntegrationParametersFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawIntegrationParametersFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawintegrationparameters_free(ptr, 0);\n    }\n    /**\n     * @returns {number}\n     */\n    get contact_erp() {\n        const ret = wasm.rawintegrationparameters_contact_erp(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get dt() {\n        const ret = wasm.rawintegrationparameters_dt(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get lengthUnit() {\n        const ret = wasm.rawintegrationparameters_lengthUnit(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get maxCcdSubsteps() {\n        const ret = wasm.rawintegrationparameters_maxCcdSubsteps(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    constructor() {\n        const ret = wasm.rawintegrationparameters_new();\n        this.__wbg_ptr = ret;\n        RawIntegrationParametersFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n    /**\n     * @returns {number}\n     */\n    get normalizedAllowedLinearError() {\n        const ret = wasm.rawintegrationparameters_normalizedAllowedLinearError(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get normalizedPredictionDistance() {\n        const ret = wasm.rawintegrationparameters_normalizedPredictionDistance(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get numInternalPgsIterations() {\n        const ret = wasm.rawintegrationparameters_numInternalPgsIterations(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @returns {number}\n     */\n    get numSolverIterations() {\n        const ret = wasm.rawintegrationparameters_numSolverIterations(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @param {number} value\n     */\n    set contact_natural_frequency(value) {\n        wasm.rawintegrationparameters_set_contact_natural_frequency(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set dt(value) {\n        wasm.rawintegrationparameters_set_dt(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set lengthUnit(value) {\n        wasm.rawintegrationparameters_set_lengthUnit(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set maxCcdSubsteps(value) {\n        wasm.rawintegrationparameters_set_maxCcdSubsteps(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set normalizedAllowedLinearError(value) {\n        wasm.rawintegrationparameters_set_normalizedAllowedLinearError(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set normalizedPredictionDistance(value) {\n        wasm.rawintegrationparameters_set_normalizedPredictionDistance(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set numInternalPgsIterations(value) {\n        wasm.rawintegrationparameters_set_numInternalPgsIterations(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set numSolverIterations(value) {\n        wasm.rawintegrationparameters_set_numSolverIterations(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set softBodiesContactStiffening(value) {\n        wasm.rawintegrationparameters_set_softBodiesContactStiffening(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set softBodiesFemLinearTolerance(value) {\n        wasm.rawintegrationparameters_set_softBodiesFemLinearTolerance(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set softBodiesFemMaxDenseDofs(value) {\n        wasm.rawintegrationparameters_set_softBodiesFemMaxDenseDofs(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set softBodiesFemMaxLinearIterations(value) {\n        wasm.rawintegrationparameters_set_softBodiesFemMaxLinearIterations(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set softBodiesMaxExtraSubsteps(value) {\n        wasm.rawintegrationparameters_set_softBodiesMaxExtraSubsteps(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {RawSoftRecoverySettings} value\n     */\n    set softBodiesRecovery(value) {\n        _assertClass(value, RawSoftRecoverySettings);\n        wasm.rawintegrationparameters_set_softBodiesRecovery(this.__wbg_ptr, value.__wbg_ptr);\n    }\n    /**\n     * @param {number} value\n     */\n    set softBodiesResweepStrain(value) {\n        wasm.rawintegrationparameters_set_softBodiesResweepStrain(this.__wbg_ptr, value);\n    }\n    /**\n     * @returns {number}\n     */\n    get softBodiesContactStiffening() {\n        const ret = wasm.rawintegrationparameters_softBodiesContactStiffening(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get softBodiesFemLinearTolerance() {\n        const ret = wasm.rawintegrationparameters_softBodiesFemLinearTolerance(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get softBodiesFemMaxDenseDofs() {\n        const ret = wasm.rawintegrationparameters_softBodiesFemMaxDenseDofs(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @returns {number}\n     */\n    get softBodiesFemMaxLinearIterations() {\n        const ret = wasm.rawintegrationparameters_softBodiesFemMaxLinearIterations(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @returns {number}\n     */\n    get softBodiesMaxExtraSubsteps() {\n        const ret = wasm.rawintegrationparameters_softBodiesMaxExtraSubsteps(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @returns {RawSoftRecoverySettings}\n     */\n    get softBodiesRecovery() {\n        const ret = wasm.rawintegrationparameters_softBodiesRecovery(this.__wbg_ptr);\n        return RawSoftRecoverySettings.__wrap(ret);\n    }\n    /**\n     * @returns {number}\n     */\n    get softBodiesResweepStrain() {\n        const ret = wasm.rawintegrationparameters_softBodiesResweepStrain(this.__wbg_ptr);\n        return ret;\n    }\n}\nif (Symbol.dispose) RawIntegrationParameters.prototype[Symbol.dispose] = RawIntegrationParameters.prototype.free;\n\nexport class RawIslandManager {\n    static __wrap(ptr) {\n        const obj = Object.create(RawIslandManager.prototype);\n        obj.__wbg_ptr = ptr;\n        RawIslandManagerFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawIslandManagerFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawislandmanager_free(ptr, 0);\n    }\n    /**\n     * Applies the given JavaScript function to the integer handle of each active rigid-body\n     * managed by this island manager.\n     *\n     * After a short time of inactivity, a rigid-body is automatically deactivated (\"asleep\") by\n     * the physics engine in order to save computational power. A sleeping rigid-body never moves\n     * unless it is moved manually by the user.\n     *\n     * # Parameters\n     * - `f(handle)`: the function to apply to the integer handle of each active rigid-body managed by this\n     *   set. Called as `f(collider)`.\n     * @param {Function} f\n     */\n    forEachActiveRigidBodyHandle(f) {\n        try {\n            wasm.rawislandmanager_forEachActiveRigidBodyHandle(this.__wbg_ptr, addBorrowedObject(f));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    constructor() {\n        const ret = wasm.rawislandmanager_new();\n        this.__wbg_ptr = ret;\n        RawIslandManagerFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n}\nif (Symbol.dispose) RawIslandManager.prototype[Symbol.dispose] = RawIslandManager.prototype.free;\n\n/**\n * @enum {0 | 1 | 2 | 3 | 4 | 5}\n */\nexport const RawJointAxis = Object.freeze({\n    LinX: 0, \"0\": \"LinX\",\n    LinY: 1, \"1\": \"LinY\",\n    LinZ: 2, \"2\": \"LinZ\",\n    AngX: 3, \"3\": \"AngX\",\n    AngY: 4, \"4\": \"AngY\",\n    AngZ: 5, \"5\": \"AngZ\",\n});\n\n/**\n * @enum {0 | 1 | 2 | 3 | 4 | 5 | 6}\n */\nexport const RawJointType = Object.freeze({\n    Revolute: 0, \"0\": \"Revolute\",\n    Fixed: 1, \"1\": \"Fixed\",\n    Prismatic: 2, \"2\": \"Prismatic\",\n    Rope: 3, \"3\": \"Rope\",\n    Spring: 4, \"4\": \"Spring\",\n    Spherical: 5, \"5\": \"Spherical\",\n    Generic: 6, \"6\": \"Generic\",\n});\n\nexport class RawKinematicCharacterController {\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawKinematicCharacterControllerFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawkinematiccharactercontroller_free(ptr, 0);\n    }\n    /**\n     * @returns {boolean}\n     */\n    autostepEnabled() {\n        const ret = wasm.rawkinematiccharactercontroller_autostepEnabled(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {boolean | undefined}\n     */\n    autostepIncludesDynamicBodies() {\n        const ret = wasm.rawkinematiccharactercontroller_autostepIncludesDynamicBodies(this.__wbg_ptr);\n        return ret === 0xFFFFFF ? undefined : ret !== 0;\n    }\n    /**\n     * @returns {number | undefined}\n     */\n    autostepMaxHeight() {\n        const ret = wasm.rawkinematiccharactercontroller_autostepMaxHeight(this.__wbg_ptr);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @returns {number | undefined}\n     */\n    autostepMinWidth() {\n        const ret = wasm.rawkinematiccharactercontroller_autostepMinWidth(this.__wbg_ptr);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} dt\n     * @param {RawBroadPhase} broad_phase\n     * @param {RawNarrowPhase} narrow_phase\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @param {number} collider_handle\n     * @param {RawVector} desired_translation_delta\n     * @param {boolean} apply_impulses_to_dynamic_bodies\n     * @param {number | null | undefined} character_mass\n     * @param {number} filter_flags\n     * @param {number | null | undefined} filter_groups\n     * @param {Function} filter_predicate\n     */\n    computeColliderMovement(dt, broad_phase, narrow_phase, bodies, colliders, collider_handle, desired_translation_delta, apply_impulses_to_dynamic_bodies, character_mass, filter_flags, filter_groups, filter_predicate) {\n        try {\n            _assertClass(broad_phase, RawBroadPhase);\n            _assertClass(narrow_phase, RawNarrowPhase);\n            _assertClass(bodies, RawRigidBodySet);\n            _assertClass(colliders, RawColliderSet);\n            _assertClass(desired_translation_delta, RawVector);\n            wasm.rawkinematiccharactercontroller_computeColliderMovement(this.__wbg_ptr, dt, broad_phase.__wbg_ptr, narrow_phase.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr, collider_handle, desired_translation_delta.__wbg_ptr, apply_impulses_to_dynamic_bodies, isLikeNone(character_mass) ? Number.MAX_SAFE_INTEGER : Math.fround(character_mass), filter_flags, isLikeNone(filter_groups) ? Number.MAX_SAFE_INTEGER : (filter_groups) >>> 0, addBorrowedObject(filter_predicate));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} i\n     * @param {RawCharacterCollision} collision\n     * @returns {boolean}\n     */\n    computedCollision(i, collision) {\n        _assertClass(collision, RawCharacterCollision);\n        const ret = wasm.rawkinematiccharactercontroller_computedCollision(this.__wbg_ptr, i, collision.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {boolean}\n     */\n    computedGrounded() {\n        const ret = wasm.rawkinematiccharactercontroller_computedGrounded(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @param {Float32Array} scratch_buffer\n     */\n    computedMovement(scratch_buffer) {\n        try {\n            wasm.rawkinematiccharactercontroller_computedMovement(this.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    disableAutostep() {\n        wasm.rawkinematiccharactercontroller_disableAutostep(this.__wbg_ptr);\n    }\n    disableSnapToGround() {\n        wasm.rawkinematiccharactercontroller_disableSnapToGround(this.__wbg_ptr);\n    }\n    /**\n     * @param {number} maxHeight\n     * @param {number} minWidth\n     * @param {boolean} includeDynamicBodies\n     */\n    enableAutostep(maxHeight, minWidth, includeDynamicBodies) {\n        wasm.rawkinematiccharactercontroller_enableAutostep(this.__wbg_ptr, maxHeight, minWidth, includeDynamicBodies);\n    }\n    /**\n     * @param {number} distance\n     */\n    enableSnapToGround(distance) {\n        wasm.rawkinematiccharactercontroller_enableSnapToGround(this.__wbg_ptr, distance);\n    }\n    /**\n     * @returns {number}\n     */\n    maxSlopeClimbAngle() {\n        const ret = wasm.rawkinematiccharactercontroller_maxSlopeClimbAngle(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    minSlopeSlideAngle() {\n        const ret = wasm.rawkinematiccharactercontroller_minSlopeSlideAngle(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @param {number} offset\n     */\n    constructor(offset) {\n        const ret = wasm.rawkinematiccharactercontroller_new(offset);\n        this.__wbg_ptr = ret;\n        RawKinematicCharacterControllerFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n    /**\n     * @returns {number}\n     */\n    normalNudgeFactor() {\n        const ret = wasm.rawkinematiccharactercontroller_normalNudgeFactor(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    numComputedCollisions() {\n        const ret = wasm.rawkinematiccharactercontroller_numComputedCollisions(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @returns {number}\n     */\n    offset() {\n        const ret = wasm.rawkinematiccharactercontroller_offset(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @param {number} angle\n     */\n    setMaxSlopeClimbAngle(angle) {\n        wasm.rawkinematiccharactercontroller_setMaxSlopeClimbAngle(this.__wbg_ptr, angle);\n    }\n    /**\n     * @param {number} angle\n     */\n    setMinSlopeSlideAngle(angle) {\n        wasm.rawkinematiccharactercontroller_setMinSlopeSlideAngle(this.__wbg_ptr, angle);\n    }\n    /**\n     * @param {number} value\n     */\n    setNormalNudgeFactor(value) {\n        wasm.rawkinematiccharactercontroller_setNormalNudgeFactor(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    setOffset(value) {\n        wasm.rawkinematiccharactercontroller_setOffset(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {boolean} enabled\n     */\n    setSlideEnabled(enabled) {\n        wasm.rawkinematiccharactercontroller_setSlideEnabled(this.__wbg_ptr, enabled);\n    }\n    /**\n     * @param {RawVector} vector\n     */\n    setUp(vector) {\n        _assertClass(vector, RawVector);\n        wasm.rawkinematiccharactercontroller_setUp(this.__wbg_ptr, vector.__wbg_ptr);\n    }\n    /**\n     * @returns {boolean}\n     */\n    slideEnabled() {\n        const ret = wasm.rawkinematiccharactercontroller_slideEnabled(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {number | undefined}\n     */\n    snapToGroundDistance() {\n        const ret = wasm.rawkinematiccharactercontroller_snapToGroundDistance(this.__wbg_ptr);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @returns {boolean}\n     */\n    snapToGroundEnabled() {\n        const ret = wasm.rawkinematiccharactercontroller_snapToGroundEnabled(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {RawVector}\n     */\n    up() {\n        const ret = wasm.rawkinematiccharactercontroller_up(this.__wbg_ptr);\n        return RawVector.__wrap(ret);\n    }\n}\nif (Symbol.dispose) RawKinematicCharacterController.prototype[Symbol.dispose] = RawKinematicCharacterController.prototype.free;\n\n/**\n * @enum {0 | 1}\n */\nexport const RawMotorModel = Object.freeze({\n    AccelerationBased: 0, \"0\": \"AccelerationBased\",\n    ForceBased: 1, \"1\": \"ForceBased\",\n});\n\nexport class RawMultibodyJointSet {\n    static __wrap(ptr) {\n        const obj = Object.create(RawMultibodyJointSet.prototype);\n        obj.__wbg_ptr = ptr;\n        RawMultibodyJointSetFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawMultibodyJointSetFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawmultibodyjointset_free(ptr, 0);\n    }\n    /**\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    contains(handle) {\n        const ret = wasm.rawmultibodyjointset_contains(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * @param {RawGenericJoint} params\n     * @param {number} parent1\n     * @param {number} parent2\n     * @param {boolean} wakeUp\n     * @returns {number}\n     */\n    createJoint(params, parent1, parent2, wakeUp) {\n        _assertClass(params, RawGenericJoint);\n        const ret = wasm.rawmultibodyjointset_createJoint(this.__wbg_ptr, params.__wbg_ptr, parent1, parent2, wakeUp);\n        return ret;\n    }\n    /**\n     * Applies the given JavaScript function to the integer handle of each joint attached to the given rigid-body.\n     *\n     * # Parameters\n     * - `f(handle)`: the function to apply to the integer handle of each joint attached to the rigid-body. Called as `f(collider)`.\n     * @param {number} body\n     * @param {Function} f\n     */\n    forEachJointAttachedToRigidBody(body, f) {\n        try {\n            wasm.rawmultibodyjointset_forEachJointAttachedToRigidBody(this.__wbg_ptr, body, addBorrowedObject(f));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * Applies the given JavaScript function to the integer handle of each joint managed by this physics world.\n     *\n     * # Parameters\n     * - `f(handle)`: the function to apply to the integer handle of each joint managed by this set. Called as `f(collider)`.\n     * @param {Function} f\n     */\n    forEachJointHandle(f) {\n        try {\n            wasm.rawmultibodyjointset_forEachJointHandle(this.__wbg_ptr, addBorrowedObject(f));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * The position of the first anchor of this joint.\n     *\n     * The first anchor gives the position of the points application point on the\n     * local frame of the first rigid-body it is attached to.\n     * @param {number} handle\n     * @returns {RawVector}\n     */\n    jointAnchor1(handle) {\n        const ret = wasm.rawmultibodyjointset_jointAnchor1(this.__wbg_ptr, handle);\n        return RawVector.__wrap(ret);\n    }\n    /**\n     * The position of the second anchor of this joint.\n     *\n     * The second anchor gives the position of the points application point on the\n     * local frame of the second rigid-body it is attached to.\n     * @param {number} handle\n     * @returns {RawVector}\n     */\n    jointAnchor2(handle) {\n        const ret = wasm.rawmultibodyjointset_jointAnchor2(this.__wbg_ptr, handle);\n        return RawVector.__wrap(ret);\n    }\n    /**\n     * Are contacts between the rigid-bodies attached by this joint enabled?\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    jointContactsEnabled(handle) {\n        const ret = wasm.rawmultibodyjointset_jointContactsEnabled(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * The angular part of the joint’s local frame relative to the first rigid-body it is attached to.\n     * @param {number} handle\n     * @returns {RawRotation}\n     */\n    jointFrameX1(handle) {\n        const ret = wasm.rawmultibodyjointset_jointFrameX1(this.__wbg_ptr, handle);\n        return RawRotation.__wrap(ret);\n    }\n    /**\n     * The angular part of the joint’s local frame relative to the second rigid-body it is attached to.\n     * @param {number} handle\n     * @returns {RawRotation}\n     */\n    jointFrameX2(handle) {\n        const ret = wasm.rawmultibodyjointset_jointFrameX2(this.__wbg_ptr, handle);\n        return RawRotation.__wrap(ret);\n    }\n    /**\n     * Are the limits for this joint enabled?\n     * @param {number} handle\n     * @param {RawJointAxis} axis\n     * @returns {boolean}\n     */\n    jointLimitsEnabled(handle, axis) {\n        const ret = wasm.rawmultibodyjointset_jointLimitsEnabled(this.__wbg_ptr, handle, axis);\n        return ret !== 0;\n    }\n    /**\n     * If this is a prismatic joint, returns its upper limit.\n     * @param {number} handle\n     * @param {RawJointAxis} axis\n     * @returns {number}\n     */\n    jointLimitsMax(handle, axis) {\n        const ret = wasm.rawmultibodyjointset_jointLimitsMax(this.__wbg_ptr, handle, axis);\n        return ret;\n    }\n    /**\n     * Return the lower limit along the given joint axis.\n     * @param {number} handle\n     * @param {RawJointAxis} axis\n     * @returns {number}\n     */\n    jointLimitsMin(handle, axis) {\n        const ret = wasm.rawmultibodyjointset_jointLimitsMin(this.__wbg_ptr, handle, axis);\n        return ret;\n    }\n    /**\n     * Sets whether contacts are enabled between the rigid-bodies attached by this joint.\n     * @param {number} handle\n     * @param {boolean} enabled\n     */\n    jointSetContactsEnabled(handle, enabled) {\n        wasm.rawmultibodyjointset_jointSetContactsEnabled(this.__wbg_ptr, handle, enabled);\n    }\n    /**\n     * The type of this joint.\n     * @param {number} handle\n     * @returns {RawJointType}\n     */\n    jointType(handle) {\n        const ret = wasm.rawmultibodyjointset_jointType(this.__wbg_ptr, handle);\n        return ret;\n    }\n    constructor() {\n        const ret = wasm.rawmultibodyjointset_new();\n        this.__wbg_ptr = ret;\n        RawMultibodyJointSetFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n    /**\n     * @param {number} handle\n     * @param {boolean} wakeUp\n     */\n    remove(handle, wakeUp) {\n        wasm.rawmultibodyjointset_remove(this.__wbg_ptr, handle, wakeUp);\n    }\n}\nif (Symbol.dispose) RawMultibodyJointSet.prototype[Symbol.dispose] = RawMultibodyJointSet.prototype.free;\n\nexport class RawNarrowPhase {\n    static __wrap(ptr) {\n        const obj = Object.create(RawNarrowPhase.prototype);\n        obj.__wbg_ptr = ptr;\n        RawNarrowPhaseFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawNarrowPhaseFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawnarrowphase_free(ptr, 0);\n    }\n    /**\n     * @param {number} handle1\n     * @param {number} handle2\n     * @returns {RawContactPair | undefined}\n     */\n    contact_pair(handle1, handle2) {\n        const ret = wasm.rawnarrowphase_contact_pair(this.__wbg_ptr, handle1, handle2);\n        return ret === 0 ? undefined : RawContactPair.__wrap(ret);\n    }\n    /**\n     * @param {number} handle1\n     * @param {Function} f\n     */\n    contact_pairs_with(handle1, f) {\n        wasm.rawnarrowphase_contact_pairs_with(this.__wbg_ptr, handle1, addHeapObject(f));\n    }\n    /**\n     * @param {number} handle1\n     * @param {number} handle2\n     * @returns {boolean}\n     */\n    intersection_pair(handle1, handle2) {\n        const ret = wasm.rawnarrowphase_intersection_pair(this.__wbg_ptr, handle1, handle2);\n        return ret !== 0;\n    }\n    /**\n     * @param {number} handle1\n     * @param {Function} f\n     */\n    intersection_pairs_with(handle1, f) {\n        wasm.rawnarrowphase_intersection_pairs_with(this.__wbg_ptr, handle1, addHeapObject(f));\n    }\n    constructor() {\n        const ret = wasm.rawnarrowphase_new();\n        this.__wbg_ptr = ret;\n        RawNarrowPhaseFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n}\nif (Symbol.dispose) RawNarrowPhase.prototype[Symbol.dispose] = RawNarrowPhase.prototype.free;\n\nexport class RawPhysicsPipeline {\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawPhysicsPipelineFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawphysicspipeline_free(ptr, 0);\n    }\n    /**\n     * @returns {boolean}\n     */\n    is_profiler_enabled() {\n        const ret = wasm.rawphysicspipeline_is_profiler_enabled(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    constructor() {\n        const ret = wasm.rawphysicspipeline_new();\n        this.__wbg_ptr = ret;\n        RawPhysicsPipelineFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n    /**\n     * @param {boolean} enabled\n     */\n    set_profiler_enabled(enabled) {\n        wasm.rawphysicspipeline_set_profiler_enabled(this.__wbg_ptr, enabled);\n    }\n    /**\n     * @param {RawVector} gravity\n     * @param {RawIntegrationParameters} integrationParameters\n     * @param {RawIslandManager} islands\n     * @param {RawBroadPhase} broadPhase\n     * @param {RawNarrowPhase} narrowPhase\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @param {RawSoftBodySet} softBodies\n     * @param {RawImpulseJointSet} joints\n     * @param {RawMultibodyJointSet} articulations\n     * @param {RawCCDSolver} ccd_solver\n     * @param {RawEventQueue} eventQueue\n     * @param {object} hookObject\n     * @param {Function} hookFilterContactPair\n     * @param {Function} hookFilterIntersectionPair\n     */\n    stepWithEvents(gravity, integrationParameters, islands, broadPhase, narrowPhase, bodies, colliders, softBodies, joints, articulations, ccd_solver, eventQueue, hookObject, hookFilterContactPair, hookFilterIntersectionPair) {\n        _assertClass(gravity, RawVector);\n        _assertClass(integrationParameters, RawIntegrationParameters);\n        _assertClass(islands, RawIslandManager);\n        _assertClass(broadPhase, RawBroadPhase);\n        _assertClass(narrowPhase, RawNarrowPhase);\n        _assertClass(bodies, RawRigidBodySet);\n        _assertClass(colliders, RawColliderSet);\n        _assertClass(softBodies, RawSoftBodySet);\n        _assertClass(joints, RawImpulseJointSet);\n        _assertClass(articulations, RawMultibodyJointSet);\n        _assertClass(ccd_solver, RawCCDSolver);\n        _assertClass(eventQueue, RawEventQueue);\n        wasm.rawphysicspipeline_stepWithEvents(this.__wbg_ptr, gravity.__wbg_ptr, integrationParameters.__wbg_ptr, islands.__wbg_ptr, broadPhase.__wbg_ptr, narrowPhase.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr, softBodies.__wbg_ptr, joints.__wbg_ptr, articulations.__wbg_ptr, ccd_solver.__wbg_ptr, eventQueue.__wbg_ptr, addHeapObject(hookObject), addHeapObject(hookFilterContactPair), addHeapObject(hookFilterIntersectionPair));\n    }\n    /**\n     * @param {RawVector} gravity\n     * @param {RawIntegrationParameters} integrationParameters\n     * @param {RawIslandManager} islands\n     * @param {RawBroadPhase} broadPhase\n     * @param {RawNarrowPhase} narrowPhase\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @param {RawSoftBodySet} softBodies\n     * @param {RawImpulseJointSet} joints\n     * @param {RawMultibodyJointSet} articulations\n     * @param {RawCCDSolver} ccd_solver\n     */\n    step(gravity, integrationParameters, islands, broadPhase, narrowPhase, bodies, colliders, softBodies, joints, articulations, ccd_solver) {\n        _assertClass(gravity, RawVector);\n        _assertClass(integrationParameters, RawIntegrationParameters);\n        _assertClass(islands, RawIslandManager);\n        _assertClass(broadPhase, RawBroadPhase);\n        _assertClass(narrowPhase, RawNarrowPhase);\n        _assertClass(bodies, RawRigidBodySet);\n        _assertClass(colliders, RawColliderSet);\n        _assertClass(softBodies, RawSoftBodySet);\n        _assertClass(joints, RawImpulseJointSet);\n        _assertClass(articulations, RawMultibodyJointSet);\n        _assertClass(ccd_solver, RawCCDSolver);\n        wasm.rawphysicspipeline_step(this.__wbg_ptr, gravity.__wbg_ptr, integrationParameters.__wbg_ptr, islands.__wbg_ptr, broadPhase.__wbg_ptr, narrowPhase.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr, softBodies.__wbg_ptr, joints.__wbg_ptr, articulations.__wbg_ptr, ccd_solver.__wbg_ptr);\n    }\n    /**\n     * @returns {number}\n     */\n    timing_broad_phase() {\n        const ret = wasm.rawphysicspipeline_timing_broad_phase(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    timing_ccd() {\n        const ret = wasm.rawphysicspipeline_timing_ccd(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    timing_ccd_broad_phase() {\n        const ret = wasm.rawphysicspipeline_timing_ccd_broad_phase(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    timing_ccd_narrow_phase() {\n        const ret = wasm.rawphysicspipeline_timing_ccd_narrow_phase(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    timing_ccd_solver() {\n        const ret = wasm.rawphysicspipeline_timing_ccd_solver(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    timing_ccd_toi_computation() {\n        const ret = wasm.rawphysicspipeline_timing_ccd_toi_computation(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    timing_collision_detection() {\n        const ret = wasm.rawphysicspipeline_timing_collision_detection(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    timing_island_construction() {\n        const ret = wasm.rawphysicspipeline_timing_island_construction(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    timing_narrow_phase() {\n        const ret = wasm.rawphysicspipeline_timing_narrow_phase(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    timing_solver() {\n        const ret = wasm.rawphysicspipeline_timing_solver(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    timing_step() {\n        const ret = wasm.rawphysicspipeline_timing_step(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    timing_user_changes() {\n        const ret = wasm.rawphysicspipeline_timing_user_changes(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    timing_velocity_assembly() {\n        const ret = wasm.rawphysicspipeline_timing_velocity_assembly(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    timing_velocity_resolution() {\n        const ret = wasm.rawphysicspipeline_timing_velocity_resolution(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    timing_velocity_update() {\n        const ret = wasm.rawphysicspipeline_timing_velocity_update(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    timing_velocity_writeback() {\n        const ret = wasm.rawphysicspipeline_timing_velocity_writeback(this.__wbg_ptr);\n        return ret;\n    }\n}\nif (Symbol.dispose) RawPhysicsPipeline.prototype[Symbol.dispose] = RawPhysicsPipeline.prototype.free;\n\nexport class RawPidController {\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawPidControllerFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawpidcontroller_free(ptr, 0);\n    }\n    /**\n     * @param {number} dt\n     * @param {RawRigidBodySet} bodies\n     * @param {number} rb_handle\n     * @param {RawRotation} target_rotation\n     * @param {RawVector} target_angvel\n     * @param {Float32Array} scratch_buffer\n     */\n    angular_correction(dt, bodies, rb_handle, target_rotation, target_angvel, scratch_buffer) {\n        try {\n            _assertClass(bodies, RawRigidBodySet);\n            _assertClass(target_rotation, RawRotation);\n            _assertClass(target_angvel, RawVector);\n            wasm.rawpidcontroller_angular_correction(this.__wbg_ptr, dt, bodies.__wbg_ptr, rb_handle, target_rotation.__wbg_ptr, target_angvel.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} dt\n     * @param {RawRigidBodySet} bodies\n     * @param {number} rb_handle\n     * @param {RawRotation} target_rotation\n     * @param {RawVector} target_angvel\n     */\n    apply_angular_correction(dt, bodies, rb_handle, target_rotation, target_angvel) {\n        _assertClass(bodies, RawRigidBodySet);\n        _assertClass(target_rotation, RawRotation);\n        _assertClass(target_angvel, RawVector);\n        wasm.rawpidcontroller_apply_angular_correction(this.__wbg_ptr, dt, bodies.__wbg_ptr, rb_handle, target_rotation.__wbg_ptr, target_angvel.__wbg_ptr);\n    }\n    /**\n     * @param {number} dt\n     * @param {RawRigidBodySet} bodies\n     * @param {number} rb_handle\n     * @param {RawVector} target_translation\n     * @param {RawVector} target_linvel\n     */\n    apply_linear_correction(dt, bodies, rb_handle, target_translation, target_linvel) {\n        _assertClass(bodies, RawRigidBodySet);\n        _assertClass(target_translation, RawVector);\n        _assertClass(target_linvel, RawVector);\n        wasm.rawpidcontroller_apply_linear_correction(this.__wbg_ptr, dt, bodies.__wbg_ptr, rb_handle, target_translation.__wbg_ptr, target_linvel.__wbg_ptr);\n    }\n    /**\n     * @param {number} dt\n     * @param {RawRigidBodySet} bodies\n     * @param {number} rb_handle\n     * @param {RawVector} target_translation\n     * @param {RawVector} target_linvel\n     * @param {Float32Array} scratch_buffer\n     */\n    linear_correction(dt, bodies, rb_handle, target_translation, target_linvel, scratch_buffer) {\n        try {\n            _assertClass(bodies, RawRigidBodySet);\n            _assertClass(target_translation, RawVector);\n            _assertClass(target_linvel, RawVector);\n            wasm.rawpidcontroller_linear_correction(this.__wbg_ptr, dt, bodies.__wbg_ptr, rb_handle, target_translation.__wbg_ptr, target_linvel.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} kp\n     * @param {number} ki\n     * @param {number} kd\n     * @param {number} axes_mask\n     */\n    constructor(kp, ki, kd, axes_mask) {\n        const ret = wasm.rawpidcontroller_new(kp, ki, kd, axes_mask);\n        this.__wbg_ptr = ret;\n        RawPidControllerFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n    reset_integrals() {\n        wasm.rawpidcontroller_reset_integrals(this.__wbg_ptr);\n    }\n    /**\n     * @param {number} axes_mask\n     */\n    set_axes_mask(axes_mask) {\n        wasm.rawpidcontroller_set_axes_mask(this.__wbg_ptr, axes_mask);\n    }\n    /**\n     * @param {number} kd\n     * @param {number} axes\n     */\n    set_kd(kd, axes) {\n        wasm.rawpidcontroller_set_kd(this.__wbg_ptr, kd, axes);\n    }\n    /**\n     * @param {number} ki\n     * @param {number} axes\n     */\n    set_ki(ki, axes) {\n        wasm.rawpidcontroller_set_ki(this.__wbg_ptr, ki, axes);\n    }\n    /**\n     * @param {number} kp\n     * @param {number} axes\n     */\n    set_kp(kp, axes) {\n        wasm.rawpidcontroller_set_kp(this.__wbg_ptr, kp, axes);\n    }\n}\nif (Symbol.dispose) RawPidController.prototype[Symbol.dispose] = RawPidController.prototype.free;\n\nexport class RawPointColliderProjection {\n    static __wrap(ptr) {\n        const obj = Object.create(RawPointColliderProjection.prototype);\n        obj.__wbg_ptr = ptr;\n        RawPointColliderProjectionFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawPointColliderProjectionFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawpointcolliderprojection_free(ptr, 0);\n    }\n    /**\n     * @returns {number}\n     */\n    colliderHandle() {\n        const ret = wasm.rawpointcolliderprojection_colliderHandle(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number | undefined}\n     */\n    featureId() {\n        const ret = wasm.rawpointcolliderprojection_featureId(this.__wbg_ptr);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @returns {RawFeatureType}\n     */\n    featureType() {\n        const ret = wasm.rawpointcolliderprojection_featureType(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {boolean}\n     */\n    isInside() {\n        const ret = wasm.rawpointcolliderprojection_isInside(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * Writes the projected point components into the given scratch buffer.\n     * @param {Float32Array} scratch_buffer\n     */\n    point(scratch_buffer) {\n        try {\n            wasm.rawpointcolliderprojection_point(this.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n}\nif (Symbol.dispose) RawPointColliderProjection.prototype[Symbol.dispose] = RawPointColliderProjection.prototype.free;\n\nexport class RawPointProjection {\n    static __wrap(ptr) {\n        const obj = Object.create(RawPointProjection.prototype);\n        obj.__wbg_ptr = ptr;\n        RawPointProjectionFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawPointProjectionFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawpointprojection_free(ptr, 0);\n    }\n    /**\n     * @returns {boolean}\n     */\n    isInside() {\n        const ret = wasm.rawpointprojection_isInside(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * Writes the projected point components into the given scratch buffer.\n     * @param {Float32Array} scratch_buffer\n     */\n    point(scratch_buffer) {\n        try {\n            wasm.rawpointprojection_point(this.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n}\nif (Symbol.dispose) RawPointProjection.prototype[Symbol.dispose] = RawPointProjection.prototype.free;\n\nexport class RawRayColliderHit {\n    static __wrap(ptr) {\n        const obj = Object.create(RawRayColliderHit.prototype);\n        obj.__wbg_ptr = ptr;\n        RawRayColliderHitFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawRayColliderHitFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawraycolliderhit_free(ptr, 0);\n    }\n    /**\n     * @returns {number}\n     */\n    colliderHandle() {\n        const ret = wasm.rawraycolliderhit_colliderHandle(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    timeOfImpact() {\n        const ret = wasm.rawraycolliderhit_timeOfImpact(this.__wbg_ptr);\n        return ret;\n    }\n}\nif (Symbol.dispose) RawRayColliderHit.prototype[Symbol.dispose] = RawRayColliderHit.prototype.free;\n\nexport class RawRayColliderIntersection {\n    static __wrap(ptr) {\n        const obj = Object.create(RawRayColliderIntersection.prototype);\n        obj.__wbg_ptr = ptr;\n        RawRayColliderIntersectionFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawRayColliderIntersectionFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawraycolliderintersection_free(ptr, 0);\n    }\n    /**\n     * @returns {number}\n     */\n    colliderHandle() {\n        const ret = wasm.rawraycolliderintersection_colliderHandle(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number | undefined}\n     */\n    featureId() {\n        const ret = wasm.rawraycolliderintersection_featureId(this.__wbg_ptr);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @returns {RawFeatureType}\n     */\n    featureType() {\n        const ret = wasm.rawraycolliderintersection_featureType(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * Writes the hit normal components into the given scratch buffer.\n     * @param {Float32Array} scratch_buffer\n     */\n    normal(scratch_buffer) {\n        try {\n            wasm.rawraycolliderintersection_normal(this.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @returns {number}\n     */\n    time_of_impact() {\n        const ret = wasm.rawraycolliderintersection_time_of_impact(this.__wbg_ptr);\n        return ret;\n    }\n}\nif (Symbol.dispose) RawRayColliderIntersection.prototype[Symbol.dispose] = RawRayColliderIntersection.prototype.free;\n\nexport class RawRayIntersection {\n    static __wrap(ptr) {\n        const obj = Object.create(RawRayIntersection.prototype);\n        obj.__wbg_ptr = ptr;\n        RawRayIntersectionFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawRayIntersectionFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawrayintersection_free(ptr, 0);\n    }\n    /**\n     * @returns {number | undefined}\n     */\n    featureId() {\n        const ret = wasm.rawrayintersection_featureId(this.__wbg_ptr);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @returns {RawFeatureType}\n     */\n    featureType() {\n        const ret = wasm.rawrayintersection_featureType(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * Writes the hit normal components into the given scratch buffer.\n     * @param {Float32Array} scratch_buffer\n     */\n    normal(scratch_buffer) {\n        try {\n            wasm.rawrayintersection_normal(this.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @returns {number}\n     */\n    time_of_impact() {\n        const ret = wasm.rawrayintersection_time_of_impact(this.__wbg_ptr);\n        return ret;\n    }\n}\nif (Symbol.dispose) RawRayIntersection.prototype[Symbol.dispose] = RawRayIntersection.prototype.free;\n\nexport class RawRigidBodySet {\n    static __wrap(ptr) {\n        const obj = Object.create(RawRigidBodySet.prototype);\n        obj.__wbg_ptr = ptr;\n        RawRigidBodySetFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawRigidBodySetFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawrigidbodyset_free(ptr, 0);\n    }\n    /**\n     * Checks if a rigid-body with the given integer handle exists.\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    contains(handle) {\n        const ret = wasm.rawrigidbodyset_contains(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * @param {boolean} enabled\n     * @param {RawVector} translation\n     * @param {RawRotation} rotation\n     * @param {number} gravityScale\n     * @param {number} mass\n     * @param {boolean} massOnly\n     * @param {RawVector} centerOfMass\n     * @param {RawVector} linvel\n     * @param {RawVector} angvel\n     * @param {RawVector} principalAngularInertia\n     * @param {RawRotation} angularInertiaFrame\n     * @param {boolean} translationEnabledX\n     * @param {boolean} translationEnabledY\n     * @param {boolean} translationEnabledZ\n     * @param {boolean} rotationEnabledX\n     * @param {boolean} rotationEnabledY\n     * @param {boolean} rotationEnabledZ\n     * @param {number} linearDamping\n     * @param {number} angularDamping\n     * @param {RawRigidBodyType} rb_type\n     * @param {boolean} canSleep\n     * @param {boolean} sleeping\n     * @param {number} softCcdPrediction\n     * @param {boolean} ccdEnabled\n     * @param {number} dominanceGroup\n     * @param {number} additional_solver_iterations\n     * @param {number} additional_pgs_iterations\n     * @returns {number}\n     */\n    createRigidBody(enabled, translation, rotation, gravityScale, mass, massOnly, centerOfMass, linvel, angvel, principalAngularInertia, angularInertiaFrame, translationEnabledX, translationEnabledY, translationEnabledZ, rotationEnabledX, rotationEnabledY, rotationEnabledZ, linearDamping, angularDamping, rb_type, canSleep, sleeping, softCcdPrediction, ccdEnabled, dominanceGroup, additional_solver_iterations, additional_pgs_iterations) {\n        _assertClass(translation, RawVector);\n        _assertClass(rotation, RawRotation);\n        _assertClass(centerOfMass, RawVector);\n        _assertClass(linvel, RawVector);\n        _assertClass(angvel, RawVector);\n        _assertClass(principalAngularInertia, RawVector);\n        _assertClass(angularInertiaFrame, RawRotation);\n        const ret = wasm.rawrigidbodyset_createRigidBody(this.__wbg_ptr, enabled, translation.__wbg_ptr, rotation.__wbg_ptr, gravityScale, mass, massOnly, centerOfMass.__wbg_ptr, linvel.__wbg_ptr, angvel.__wbg_ptr, principalAngularInertia.__wbg_ptr, angularInertiaFrame.__wbg_ptr, translationEnabledX, translationEnabledY, translationEnabledZ, rotationEnabledX, rotationEnabledY, rotationEnabledZ, linearDamping, angularDamping, rb_type, canSleep, sleeping, softCcdPrediction, ccdEnabled, dominanceGroup, additional_solver_iterations, additional_pgs_iterations);\n        return ret;\n    }\n    /**\n     * Applies the given JavaScript function to the integer handle of each rigid-body managed by this set.\n     *\n     * # Parameters\n     * - `f(handle)`: the function to apply to the integer handle of each rigid-body managed by this set. Called as `f(collider)`.\n     * @param {Function} f\n     */\n    forEachRigidBodyHandle(f) {\n        try {\n            wasm.rawrigidbodyset_forEachRigidBodyHandle(this.__wbg_ptr, addBorrowedObject(f));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * The number of rigid-bodies on this set.\n     * @returns {number}\n     */\n    len() {\n        const ret = wasm.rawrigidbodyset_len(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    constructor() {\n        const ret = wasm.rawrigidbodyset_new();\n        this.__wbg_ptr = ret;\n        RawRigidBodySetFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n    /**\n     * @param {RawColliderSet} colliders\n     */\n    propagateModifiedBodyPositionsToColliders(colliders) {\n        _assertClass(colliders, RawColliderSet);\n        wasm.rawrigidbodyset_propagateModifiedBodyPositionsToColliders(this.__wbg_ptr, colliders.__wbg_ptr);\n    }\n    /**\n     * Adds a force at the given world-space point of this rigid-body.\n     *\n     * # Parameters\n     * - `force`: the world-space force to apply on the rigid-body.\n     * - `point`: the world-space point where the impulse is to be applied on the rigid-body.\n     * - `wakeUp`: should the rigid-body be automatically woken-up?\n     * @param {number} handle\n     * @param {RawVector} force\n     * @param {RawVector} point\n     * @param {boolean} wakeUp\n     */\n    rbAddForceAtPoint(handle, force, point, wakeUp) {\n        _assertClass(force, RawVector);\n        _assertClass(point, RawVector);\n        wasm.rawrigidbodyset_rbAddForceAtPoint(this.__wbg_ptr, handle, force.__wbg_ptr, point.__wbg_ptr, wakeUp);\n    }\n    /**\n     * Adds a force at the center-of-mass of this rigid-body.\n     *\n     * # Parameters\n     * - `force`: the world-space force to apply on the rigid-body.\n     * - `wakeUp`: should the rigid-body be automatically woken-up?\n     * @param {number} handle\n     * @param {RawVector} force\n     * @param {boolean} wakeUp\n     */\n    rbAddForce(handle, force, wakeUp) {\n        _assertClass(force, RawVector);\n        wasm.rawrigidbodyset_rbAddForce(this.__wbg_ptr, handle, force.__wbg_ptr, wakeUp);\n    }\n    /**\n     * Adds a torque at the center-of-mass of this rigid-body.\n     *\n     * # Parameters\n     * - `torque`: the world-space torque to apply on the rigid-body.\n     * - `wakeUp`: should the rigid-body be automatically woken-up?\n     * @param {number} handle\n     * @param {RawVector} torque\n     * @param {boolean} wakeUp\n     */\n    rbAddTorque(handle, torque, wakeUp) {\n        _assertClass(torque, RawVector);\n        wasm.rawrigidbodyset_rbAddTorque(this.__wbg_ptr, handle, torque.__wbg_ptr, wakeUp);\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    rbAdditionalPgsIterations(handle) {\n        const ret = wasm.rawrigidbodyset_rbAdditionalPgsIterations(this.__wbg_ptr, handle);\n        return ret >>> 0;\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    rbAdditionalSolverIterations(handle) {\n        const ret = wasm.rawrigidbodyset_rbAdditionalSolverIterations(this.__wbg_ptr, handle);\n        return ret >>> 0;\n    }\n    /**\n     * The angular damping coefficient of this rigid-body.\n     * @param {number} handle\n     * @returns {number}\n     */\n    rbAngularDamping(handle) {\n        const ret = wasm.rawrigidbodyset_rbAngularDamping(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * The angular velocity of this rigid-body.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    rbAngvel(handle, scratch_buffer) {\n        try {\n            wasm.rawrigidbodyset_rbAngvel(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * Applies an impulse at the given world-space point of this rigid-body.\n     *\n     * # Parameters\n     * - `impulse`: the world-space impulse to apply on the rigid-body.\n     * - `point`: the world-space point where the impulse is to be applied on the rigid-body.\n     * - `wakeUp`: should the rigid-body be automatically woken-up?\n     * @param {number} handle\n     * @param {RawVector} impulse\n     * @param {RawVector} point\n     * @param {boolean} wakeUp\n     */\n    rbApplyImpulseAtPoint(handle, impulse, point, wakeUp) {\n        _assertClass(impulse, RawVector);\n        _assertClass(point, RawVector);\n        wasm.rawrigidbodyset_rbApplyImpulseAtPoint(this.__wbg_ptr, handle, impulse.__wbg_ptr, point.__wbg_ptr, wakeUp);\n    }\n    /**\n     * Applies an impulse at the center-of-mass of this rigid-body.\n     *\n     * # Parameters\n     * - `impulse`: the world-space impulse to apply on the rigid-body.\n     * - `wakeUp`: should the rigid-body be automatically woken-up?\n     * @param {number} handle\n     * @param {RawVector} impulse\n     * @param {boolean} wakeUp\n     */\n    rbApplyImpulse(handle, impulse, wakeUp) {\n        _assertClass(impulse, RawVector);\n        wasm.rawrigidbodyset_rbApplyImpulse(this.__wbg_ptr, handle, impulse.__wbg_ptr, wakeUp);\n    }\n    /**\n     * Applies an impulsive torque at the center-of-mass of this rigid-body.\n     *\n     * # Parameters\n     * - `torque impulse`: the world-space torque impulse to apply on the rigid-body.\n     * - `wakeUp`: should the rigid-body be automatically woken-up?\n     * @param {number} handle\n     * @param {RawVector} torque_impulse\n     * @param {boolean} wakeUp\n     */\n    rbApplyTorqueImpulse(handle, torque_impulse, wakeUp) {\n        _assertClass(torque_impulse, RawVector);\n        wasm.rawrigidbodyset_rbApplyTorqueImpulse(this.__wbg_ptr, handle, torque_impulse.__wbg_ptr, wakeUp);\n    }\n    /**\n     * The status of this rigid-body: fixed, dynamic, or kinematic.\n     * @param {number} handle\n     * @returns {RawRigidBodyType}\n     */\n    rbBodyType(handle) {\n        const ret = wasm.rawrigidbodyset_rbBodyType(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * Retrieves the `i-th` collider attached to this rigid-body.\n     *\n     * # Parameters\n     * - `at`: The index of the collider to retrieve. Must be a number in `[0, this.numColliders()[`.\n     *         This index is **not** the same as the unique identifier of the collider.\n     * @param {number} handle\n     * @param {number} at\n     * @returns {number}\n     */\n    rbCollider(handle, at) {\n        const ret = wasm.rawrigidbodyset_rbCollider(this.__wbg_ptr, handle, at);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    rbDominanceGroup(handle) {\n        const ret = wasm.rawrigidbodyset_rbDominanceGroup(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * The effective world-space angular inertia (that takes the potential rotation locking into account) of\n     * this rigid-body.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    rbEffectiveAngularInertia(handle, scratch_buffer) {\n        try {\n            wasm.rawrigidbodyset_rbEffectiveAngularInertia(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * The inverse mass taking into account translation locking.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    rbEffectiveInvMass(handle, scratch_buffer) {\n        try {\n            wasm.rawrigidbodyset_rbEffectiveInvMass(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * The world-space inverse angular inertia tensor of the rigid-body,\n     * taking into account rotation locking.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    rbEffectiveWorldInvInertia(handle, scratch_buffer) {\n        try {\n            wasm.rawrigidbodyset_rbEffectiveWorldInvInertia(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} handle\n     * @param {boolean} enabled\n     */\n    rbEnableCcd(handle, enabled) {\n        wasm.rawrigidbodyset_rbEnableCcd(this.__wbg_ptr, handle, enabled);\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    rbGravityScale(handle) {\n        const ret = wasm.rawrigidbodyset_rbGravityScale(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * The inverse of the mass of a rigid-body.\n     *\n     * If this is zero, the rigid-body is assumed to have infinite mass.\n     * @param {number} handle\n     * @returns {number}\n     */\n    rbInvMass(handle) {\n        const ret = wasm.rawrigidbodyset_rbInvMass(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * The inverse of the principal angular inertia of the rigid-body.\n     *\n     * Components set to zero are assumed to be infinite along the corresponding principal axis.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    rbInvPrincipalInertia(handle, scratch_buffer) {\n        try {\n            wasm.rawrigidbodyset_rbInvPrincipalInertia(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * Is Continuous Collision Detection enabled for this rigid-body?\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    rbIsCcdEnabled(handle) {\n        const ret = wasm.rawrigidbodyset_rbIsCcdEnabled(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * Is this rigid-body dynamic?\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    rbIsDynamic(handle) {\n        const ret = wasm.rawrigidbodyset_rbIsDynamic(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    rbIsEnabled(handle) {\n        const ret = wasm.rawrigidbodyset_rbIsEnabled(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * Is this rigid-body fixed?\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    rbIsFixed(handle) {\n        const ret = wasm.rawrigidbodyset_rbIsFixed(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * Is this rigid-body kinematic?\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    rbIsKinematic(handle) {\n        const ret = wasm.rawrigidbodyset_rbIsKinematic(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * Is the velocity of this rigid-body not zero?\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    rbIsMoving(handle) {\n        const ret = wasm.rawrigidbodyset_rbIsMoving(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * Is this rigid-body sleeping?\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    rbIsSleeping(handle) {\n        const ret = wasm.rawrigidbodyset_rbIsSleeping(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * Is this rigid-body the proxy of a soft-body cluster?\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    rbIsSoftFrame(handle) {\n        const ret = wasm.rawrigidbodyset_rbIsSoftFrame(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * The linear damping coefficient of this rigid-body.\n     * @param {number} handle\n     * @returns {number}\n     */\n    rbLinearDamping(handle) {\n        const ret = wasm.rawrigidbodyset_rbLinearDamping(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * The linear velocity of this rigid-body.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    rbLinvel(handle, scratch_buffer) {\n        try {\n            wasm.rawrigidbodyset_rbLinvel(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * The center of mass of a rigid-body expressed in its local-space.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    rbLocalCom(handle, scratch_buffer) {\n        try {\n            wasm.rawrigidbodyset_rbLocalCom(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} handle\n     * @param {boolean} locked\n     * @param {boolean} wake_up\n     */\n    rbLockRotations(handle, locked, wake_up) {\n        wasm.rawrigidbodyset_rbLockRotations(this.__wbg_ptr, handle, locked, wake_up);\n    }\n    /**\n     * @param {number} handle\n     * @param {boolean} locked\n     * @param {boolean} wake_up\n     */\n    rbLockTranslations(handle, locked, wake_up) {\n        wasm.rawrigidbodyset_rbLockTranslations(this.__wbg_ptr, handle, locked, wake_up);\n    }\n    /**\n     * The mass of this rigid-body.\n     * @param {number} handle\n     * @returns {number}\n     */\n    rbMass(handle) {\n        const ret = wasm.rawrigidbodyset_rbMass(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * The world-space predicted orientation of this rigid-body.\n     *\n     * If this rigid-body is kinematic this value is set by the `setNextKinematicRotation`\n     * method and is used for estimating the kinematic body velocity at the next timestep.\n     * For non-kinematic bodies, this value is currently unspecified.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    rbNextRotation(handle, scratch_buffer) {\n        try {\n            wasm.rawrigidbodyset_rbNextRotation(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * The world-space predicted translation of this rigid-body.\n     *\n     * If this rigid-body is kinematic this value is set by the `setNextKinematicTranslation`\n     * method and is used for estimating the kinematic body velocity at the next timestep.\n     * For non-kinematic bodies, this value is currently unspecified.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    rbNextTranslation(handle, scratch_buffer) {\n        try {\n            wasm.rawrigidbodyset_rbNextTranslation(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * The number of colliders attached to this rigid-body.\n     * @param {number} handle\n     * @returns {number}\n     */\n    rbNumColliders(handle) {\n        const ret = wasm.rawrigidbodyset_rbNumColliders(this.__wbg_ptr, handle);\n        return ret >>> 0;\n    }\n    /**\n     * The principal vectors of the local angular inertia tensor of the rigid-body.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    rbPrincipalInertiaLocalFrame(handle, scratch_buffer) {\n        try {\n            wasm.rawrigidbodyset_rbPrincipalInertiaLocalFrame(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * The angular inertia along the principal inertia axes of the rigid-body.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    rbPrincipalInertia(handle, scratch_buffer) {\n        try {\n            wasm.rawrigidbodyset_rbPrincipalInertia(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} handle\n     * @param {RawColliderSet} colliders\n     */\n    rbRecomputeMassPropertiesFromColliders(handle, colliders) {\n        _assertClass(colliders, RawColliderSet);\n        wasm.rawrigidbodyset_rbRecomputeMassPropertiesFromColliders(this.__wbg_ptr, handle, colliders.__wbg_ptr);\n    }\n    /**\n     * Resets to zero all user-added forces added to this rigid-body.\n     * @param {number} handle\n     * @param {boolean} wakeUp\n     */\n    rbResetForces(handle, wakeUp) {\n        wasm.rawrigidbodyset_rbResetForces(this.__wbg_ptr, handle, wakeUp);\n    }\n    /**\n     * Resets to zero all user-added torques added to this rigid-body.\n     * @param {number} handle\n     * @param {boolean} wakeUp\n     */\n    rbResetTorques(handle, wakeUp) {\n        wasm.rawrigidbodyset_rbResetTorques(this.__wbg_ptr, handle, wakeUp);\n    }\n    /**\n     * The world-space orientation of this rigid-body.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    rbRotation(handle, scratch_buffer) {\n        try {\n            wasm.rawrigidbodyset_rbRotation(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} handle\n     * @param {number} mass\n     * @param {RawVector} centerOfMass\n     * @param {RawVector} principalAngularInertia\n     * @param {RawRotation} angularInertiaFrame\n     * @param {boolean} wake_up\n     */\n    rbSetAdditionalMassProperties(handle, mass, centerOfMass, principalAngularInertia, angularInertiaFrame, wake_up) {\n        _assertClass(centerOfMass, RawVector);\n        _assertClass(principalAngularInertia, RawVector);\n        _assertClass(angularInertiaFrame, RawRotation);\n        wasm.rawrigidbodyset_rbSetAdditionalMassProperties(this.__wbg_ptr, handle, mass, centerOfMass.__wbg_ptr, principalAngularInertia.__wbg_ptr, angularInertiaFrame.__wbg_ptr, wake_up);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} mass\n     * @param {boolean} wake_up\n     */\n    rbSetAdditionalMass(handle, mass, wake_up) {\n        wasm.rawrigidbodyset_rbSetAdditionalMass(this.__wbg_ptr, handle, mass, wake_up);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} iters\n     */\n    rbSetAdditionalPgsIterations(handle, iters) {\n        wasm.rawrigidbodyset_rbSetAdditionalPgsIterations(this.__wbg_ptr, handle, iters);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} iters\n     */\n    rbSetAdditionalSolverIterations(handle, iters) {\n        wasm.rawrigidbodyset_rbSetAdditionalSolverIterations(this.__wbg_ptr, handle, iters);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} factor\n     */\n    rbSetAngularDamping(handle, factor) {\n        wasm.rawrigidbodyset_rbSetAngularDamping(this.__wbg_ptr, handle, factor);\n    }\n    /**\n     * Sets the angular velocity of this rigid-body.\n     * @param {number} handle\n     * @param {RawVector} angvel\n     * @param {boolean} wakeUp\n     */\n    rbSetAngvel(handle, angvel, wakeUp) {\n        _assertClass(angvel, RawVector);\n        wasm.rawrigidbodyset_rbSetAngvel(this.__wbg_ptr, handle, angvel.__wbg_ptr, wakeUp);\n    }\n    /**\n     * Set a new status for this rigid-body: fixed, dynamic, or kinematic.\n     * @param {number} handle\n     * @param {RawRigidBodyType} status\n     * @param {boolean} wake_up\n     */\n    rbSetBodyType(handle, status, wake_up) {\n        wasm.rawrigidbodyset_rbSetBodyType(this.__wbg_ptr, handle, status, wake_up);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} group\n     */\n    rbSetDominanceGroup(handle, group) {\n        wasm.rawrigidbodyset_rbSetDominanceGroup(this.__wbg_ptr, handle, group);\n    }\n    /**\n     * @param {number} handle\n     * @param {boolean} allow_x\n     * @param {boolean} allow_y\n     * @param {boolean} allow_z\n     * @param {boolean} wake_up\n     */\n    rbSetEnabledRotations(handle, allow_x, allow_y, allow_z, wake_up) {\n        wasm.rawrigidbodyset_rbSetEnabledRotations(this.__wbg_ptr, handle, allow_x, allow_y, allow_z, wake_up);\n    }\n    /**\n     * @param {number} handle\n     * @param {boolean} allow_x\n     * @param {boolean} allow_y\n     * @param {boolean} allow_z\n     * @param {boolean} wake_up\n     */\n    rbSetEnabledTranslations(handle, allow_x, allow_y, allow_z, wake_up) {\n        wasm.rawrigidbodyset_rbSetEnabledTranslations(this.__wbg_ptr, handle, allow_x, allow_y, allow_z, wake_up);\n    }\n    /**\n     * @param {number} handle\n     * @param {boolean} enabled\n     */\n    rbSetEnabled(handle, enabled) {\n        wasm.rawrigidbodyset_rbSetEnabled(this.__wbg_ptr, handle, enabled);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} factor\n     * @param {boolean} wakeUp\n     */\n    rbSetGravityScale(handle, factor, wakeUp) {\n        wasm.rawrigidbodyset_rbSetGravityScale(this.__wbg_ptr, handle, factor, wakeUp);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} factor\n     */\n    rbSetLinearDamping(handle, factor) {\n        wasm.rawrigidbodyset_rbSetLinearDamping(this.__wbg_ptr, handle, factor);\n    }\n    /**\n     * Sets the linear velocity of this rigid-body.\n     * @param {number} handle\n     * @param {RawVector} linvel\n     * @param {boolean} wakeUp\n     */\n    rbSetLinvel(handle, linvel, wakeUp) {\n        _assertClass(linvel, RawVector);\n        wasm.rawrigidbodyset_rbSetLinvel(this.__wbg_ptr, handle, linvel.__wbg_ptr, wakeUp);\n    }\n    /**\n     * If this rigid body is kinematic, sets its future rotation after the next timestep integration.\n     *\n     * This should be used instead of `rigidBody.setRotation` to make the dynamic object\n     * interacting with this kinematic body behave as expected. Internally, Rapier will compute\n     * an artificial velocity for this rigid-body from its current position and its next kinematic\n     * position. This velocity will be used to compute forces on dynamic bodies interacting with\n     * this body.\n     *\n     * # Parameters\n     * - `x`: the first vector component of the quaternion.\n     * - `y`: the second vector component of the quaternion.\n     * - `z`: the third vector component of the quaternion.\n     * - `w`: the scalar component of the quaternion.\n     * @param {number} handle\n     * @param {number} x\n     * @param {number} y\n     * @param {number} z\n     * @param {number} w\n     */\n    rbSetNextKinematicRotation(handle, x, y, z, w) {\n        wasm.rawrigidbodyset_rbSetNextKinematicRotation(this.__wbg_ptr, handle, x, y, z, w);\n    }\n    /**\n     * If this rigid body is kinematic, sets its future translation after the next timestep integration.\n     *\n     * This should be used instead of `rigidBody.setTranslation` to make the dynamic object\n     * interacting with this kinematic body behave as expected. Internally, Rapier will compute\n     * an artificial velocity for this rigid-body from its current position and its next kinematic\n     * position. This velocity will be used to compute forces on dynamic bodies interacting with\n     * this body.\n     *\n     * # Parameters\n     * - `x`: the world-space position of the rigid-body along the `x` axis.\n     * - `y`: the world-space position of the rigid-body along the `y` axis.\n     * - `z`: the world-space position of the rigid-body along the `z` axis.\n     * @param {number} handle\n     * @param {number} x\n     * @param {number} y\n     * @param {number} z\n     */\n    rbSetNextKinematicTranslation(handle, x, y, z) {\n        wasm.rawrigidbodyset_rbSetNextKinematicTranslation(this.__wbg_ptr, handle, x, y, z);\n    }\n    /**\n     * Sets the rotation quaternion of this rigid-body.\n     *\n     * This does nothing if a zero quaternion is provided.\n     *\n     * # Parameters\n     * - `x`: the first vector component of the quaternion.\n     * - `y`: the second vector component of the quaternion.\n     * - `z`: the third vector component of the quaternion.\n     * - `w`: the scalar component of the quaternion.\n     * - `wakeUp`: forces the rigid-body to wake-up so it is properly affected by forces if it\n     * wasn't moving before modifying its position.\n     * @param {number} handle\n     * @param {number} x\n     * @param {number} y\n     * @param {number} z\n     * @param {number} w\n     * @param {boolean} wakeUp\n     */\n    rbSetRotation(handle, x, y, z, w, wakeUp) {\n        wasm.rawrigidbodyset_rbSetRotation(this.__wbg_ptr, handle, x, y, z, w, wakeUp);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} prediction\n     */\n    rbSetSoftCcdPrediction(handle, prediction) {\n        wasm.rawrigidbodyset_rbSetSoftCcdPrediction(this.__wbg_ptr, handle, prediction);\n    }\n    /**\n     * Sets the translation of this rigid-body.\n     *\n     * # Parameters\n     * - `x`: the world-space position of the rigid-body along the `x` axis.\n     * - `y`: the world-space position of the rigid-body along the `y` axis.\n     * - `z`: the world-space position of the rigid-body along the `z` axis.\n     * - `wakeUp`: forces the rigid-body to wake-up so it is properly affected by forces if it\n     * wasn't moving before modifying its position.\n     * @param {number} handle\n     * @param {number} x\n     * @param {number} y\n     * @param {number} z\n     * @param {boolean} wakeUp\n     */\n    rbSetTranslation(handle, x, y, z, wakeUp) {\n        wasm.rawrigidbodyset_rbSetTranslation(this.__wbg_ptr, handle, x, y, z, wakeUp);\n    }\n    /**\n     * Sets the user-defined 32-bit integer of this rigid-body.\n     *\n     * # Parameters\n     * - `data`: an arbitrary user-defined 32-bit integer.\n     * @param {number} handle\n     * @param {number} data\n     */\n    rbSetUserData(handle, data) {\n        wasm.rawrigidbodyset_rbSetUserData(this.__wbg_ptr, handle, data);\n    }\n    /**\n     * Put the given rigid-body to sleep.\n     * @param {number} handle\n     */\n    rbSleep(handle) {\n        wasm.rawrigidbodyset_rbSleep(this.__wbg_ptr, handle);\n    }\n    /**\n     * The soft body this rigid-body is a cluster proxy of, if any.\n     * @param {number} handle\n     * @returns {number | undefined}\n     */\n    rbSoftBody(handle) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawrigidbodyset_rbSoftBody(retptr, this.__wbg_ptr, handle);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r2 = getDataViewMemory0().getFloat64(retptr + 8 * 1, true);\n            return r0 === 0 ? undefined : r2;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    rbSoftCcdPrediction(handle) {\n        const ret = wasm.rawrigidbodyset_rbSoftCcdPrediction(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * The index of the cluster this proxy stands for in its soft body, if any.\n     * @param {number} handle\n     * @returns {number | undefined}\n     */\n    rbSoftCluster(handle) {\n        const ret = wasm.rawrigidbodyset_rbSoftCluster(this.__wbg_ptr, handle);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * The world-space translation of this rigid-body.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    rbTranslation(handle, scratch_buffer) {\n        try {\n            wasm.rawrigidbodyset_rbTranslation(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * An arbitrary user-defined 32-bit integer\n     * @param {number} handle\n     * @returns {number}\n     */\n    rbUserData(handle) {\n        const ret = wasm.rawrigidbodyset_rbUserData(this.__wbg_ptr, handle);\n        return ret >>> 0;\n    }\n    /**\n     * Retrieves the constant force(s) the user added to this rigid-body.\n     * Returns zero if the rigid-body is not dynamic.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    rbUserForce(handle, scratch_buffer) {\n        try {\n            wasm.rawrigidbodyset_rbUserForce(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * Retrieves the constant torque(s) the user added to this rigid-body.\n     * Returns zero if the rigid-body is not dynamic.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    rbUserTorque(handle, scratch_buffer) {\n        try {\n            wasm.rawrigidbodyset_rbUserTorque(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * The velocity of the given world-space point on this rigid-body.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {RawVector} point\n     * @param {Float32Array} scratch_buffer\n     */\n    rbVelocityAtPoint(handle, point, scratch_buffer) {\n        try {\n            _assertClass(point, RawVector);\n            wasm.rawrigidbodyset_rbVelocityAtPoint(this.__wbg_ptr, handle, point.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * Wakes this rigid-body up.\n     *\n     * A dynamic rigid-body that does not move during several consecutive frames will\n     * be put to sleep by the physics engine, i.e., it will stop being simulated in order\n     * to avoid useless computations.\n     * This method forces a sleeping rigid-body to wake-up. This is useful, e.g., before modifying\n     * the position of a dynamic body so that it is properly simulated afterwards.\n     * @param {number} handle\n     */\n    rbWakeUp(handle) {\n        wasm.rawrigidbodyset_rbWakeUp(this.__wbg_ptr, handle);\n    }\n    /**\n     * The world-space center of mass of the rigid-body.\n     *\n     * # Parameters\n     * - `scratch_buffer`: The array to be populated.\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    rbWorldCom(handle, scratch_buffer) {\n        try {\n            wasm.rawrigidbodyset_rbWorldCom(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} handle\n     * @param {RawIslandManager} islands\n     * @param {RawColliderSet} colliders\n     * @param {RawSoftBodySet} softBodies\n     * @param {RawImpulseJointSet} joints\n     * @param {RawMultibodyJointSet} articulations\n     */\n    remove(handle, islands, colliders, softBodies, joints, articulations) {\n        _assertClass(islands, RawIslandManager);\n        _assertClass(colliders, RawColliderSet);\n        _assertClass(softBodies, RawSoftBodySet);\n        _assertClass(joints, RawImpulseJointSet);\n        _assertClass(articulations, RawMultibodyJointSet);\n        wasm.rawrigidbodyset_remove(this.__wbg_ptr, handle, islands.__wbg_ptr, colliders.__wbg_ptr, softBodies.__wbg_ptr, joints.__wbg_ptr, articulations.__wbg_ptr);\n    }\n}\nif (Symbol.dispose) RawRigidBodySet.prototype[Symbol.dispose] = RawRigidBodySet.prototype.free;\n\n/**\n * @enum {0 | 1 | 2 | 3 | 4}\n */\nexport const RawRigidBodyType = Object.freeze({\n    Dynamic: 0, \"0\": \"Dynamic\",\n    Fixed: 1, \"1\": \"Fixed\",\n    KinematicPositionBased: 2, \"2\": \"KinematicPositionBased\",\n    KinematicVelocityBased: 3, \"3\": \"KinematicVelocityBased\",\n    SoftFrame: 4, \"4\": \"SoftFrame\",\n});\n\n/**\n * A rotation quaternion.\n */\nexport class RawRotation {\n    static __wrap(ptr) {\n        const obj = Object.create(RawRotation.prototype);\n        obj.__wbg_ptr = ptr;\n        RawRotationFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawRotationFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawrotation_free(ptr, 0);\n    }\n    /**\n     * The identity quaternion.\n     * @returns {RawRotation}\n     */\n    static identity() {\n        const ret = wasm.rawrotation_identity();\n        return RawRotation.__wrap(ret);\n    }\n    /**\n     * @param {number} x\n     * @param {number} y\n     * @param {number} z\n     * @param {number} w\n     */\n    constructor(x, y, z, w) {\n        const ret = wasm.rawrotation_new(x, y, z, w);\n        this.__wbg_ptr = ret;\n        RawRotationFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n    /**\n     * The `w` component of this quaternion.\n     * @returns {number}\n     */\n    get w() {\n        const ret = wasm.rawrotation_w(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * The `x` component of this quaternion.\n     * @returns {number}\n     */\n    get x() {\n        const ret = wasm.rawrotation_x(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * The `y` component of this quaternion.\n     * @returns {number}\n     */\n    get y() {\n        const ret = wasm.rawrotation_y(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * The `z` component of this quaternion.\n     * @returns {number}\n     */\n    get z() {\n        const ret = wasm.rawrotation_z(this.__wbg_ptr);\n        return ret;\n    }\n}\nif (Symbol.dispose) RawRotation.prototype[Symbol.dispose] = RawRotation.prototype.free;\n\nexport class RawSdpMatrix3 {\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawSdpMatrix3Finalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawsdpmatrix3_free(ptr, 0);\n    }\n    /**\n     * Row major list of the upper-triangular part of the symmetric matrix.\n     * @returns {Float32Array}\n     */\n    elements() {\n        const ret = wasm.rawsdpmatrix3_elements(this.__wbg_ptr);\n        return takeObject(ret);\n    }\n}\nif (Symbol.dispose) RawSdpMatrix3.prototype[Symbol.dispose] = RawSdpMatrix3.prototype.free;\n\nexport class RawSerializationPipeline {\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawSerializationPipelineFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawserializationpipeline_free(ptr, 0);\n    }\n    /**\n     * @param {Uint8Array} data\n     * @returns {RawDeserializedWorld | undefined}\n     */\n    deserializeAll(data) {\n        const ret = wasm.rawserializationpipeline_deserializeAll(this.__wbg_ptr, addHeapObject(data));\n        return ret === 0 ? undefined : RawDeserializedWorld.__wrap(ret);\n    }\n    constructor() {\n        const ret = wasm.rawserializationpipeline_new();\n        this.__wbg_ptr = ret;\n        RawSerializationPipelineFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n    /**\n     * @param {RawVector} gravity\n     * @param {RawIntegrationParameters} integrationParameters\n     * @param {RawIslandManager} islands\n     * @param {RawBroadPhase} broadPhase\n     * @param {RawNarrowPhase} narrowPhase\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @param {RawSoftBodySet} soft_bodies\n     * @param {RawImpulseJointSet} impulse_joints\n     * @param {RawMultibodyJointSet} multibody_joints\n     * @returns {Uint8Array | undefined}\n     */\n    serializeAll(gravity, integrationParameters, islands, broadPhase, narrowPhase, bodies, colliders, soft_bodies, impulse_joints, multibody_joints) {\n        _assertClass(gravity, RawVector);\n        _assertClass(integrationParameters, RawIntegrationParameters);\n        _assertClass(islands, RawIslandManager);\n        _assertClass(broadPhase, RawBroadPhase);\n        _assertClass(narrowPhase, RawNarrowPhase);\n        _assertClass(bodies, RawRigidBodySet);\n        _assertClass(colliders, RawColliderSet);\n        _assertClass(soft_bodies, RawSoftBodySet);\n        _assertClass(impulse_joints, RawImpulseJointSet);\n        _assertClass(multibody_joints, RawMultibodyJointSet);\n        const ret = wasm.rawserializationpipeline_serializeAll(this.__wbg_ptr, gravity.__wbg_ptr, integrationParameters.__wbg_ptr, islands.__wbg_ptr, broadPhase.__wbg_ptr, narrowPhase.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr, soft_bodies.__wbg_ptr, impulse_joints.__wbg_ptr, multibody_joints.__wbg_ptr);\n        return takeObject(ret);\n    }\n}\nif (Symbol.dispose) RawSerializationPipeline.prototype[Symbol.dispose] = RawSerializationPipeline.prototype.free;\n\nexport class RawShape {\n    static __wrap(ptr) {\n        const obj = Object.create(RawShape.prototype);\n        obj.__wbg_ptr = ptr;\n        RawShapeFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    static __unwrap(jsValue) {\n        if (!(jsValue instanceof RawShape)) {\n            return 0;\n        }\n        return jsValue.__destroy_into_raw();\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawShapeFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawshape_free(ptr, 0);\n    }\n    /**\n     * @param {number} radius\n     * @returns {RawShape}\n     */\n    static ball(radius) {\n        const ret = wasm.rawshape_ball(radius);\n        return RawShape.__wrap(ret);\n    }\n    /**\n     * @param {number} halfHeight\n     * @param {number} radius\n     * @returns {RawShape}\n     */\n    static capsule(halfHeight, radius) {\n        const ret = wasm.rawshape_capsule(halfHeight, radius);\n        return RawShape.__wrap(ret);\n    }\n    /**\n     * @param {RawVector} shapePos\n     * @param {RawRotation} shapeRot\n     * @param {RawVector} rayOrig\n     * @param {RawVector} rayDir\n     * @param {number} maxToi\n     * @param {boolean} solid\n     * @returns {RawRayIntersection | undefined}\n     */\n    castRayAndGetNormal(shapePos, shapeRot, rayOrig, rayDir, maxToi, solid) {\n        _assertClass(shapePos, RawVector);\n        _assertClass(shapeRot, RawRotation);\n        _assertClass(rayOrig, RawVector);\n        _assertClass(rayDir, RawVector);\n        const ret = wasm.rawshape_castRayAndGetNormal(this.__wbg_ptr, shapePos.__wbg_ptr, shapeRot.__wbg_ptr, rayOrig.__wbg_ptr, rayDir.__wbg_ptr, maxToi, solid);\n        return ret === 0 ? undefined : RawRayIntersection.__wrap(ret);\n    }\n    /**\n     * @param {RawVector} shapePos\n     * @param {RawRotation} shapeRot\n     * @param {RawVector} rayOrig\n     * @param {RawVector} rayDir\n     * @param {number} maxToi\n     * @param {boolean} solid\n     * @returns {number}\n     */\n    castRay(shapePos, shapeRot, rayOrig, rayDir, maxToi, solid) {\n        _assertClass(shapePos, RawVector);\n        _assertClass(shapeRot, RawRotation);\n        _assertClass(rayOrig, RawVector);\n        _assertClass(rayDir, RawVector);\n        const ret = wasm.rawshape_castRay(this.__wbg_ptr, shapePos.__wbg_ptr, shapeRot.__wbg_ptr, rayOrig.__wbg_ptr, rayDir.__wbg_ptr, maxToi, solid);\n        return ret;\n    }\n    /**\n     * @param {RawVector} shapePos1\n     * @param {RawRotation} shapeRot1\n     * @param {RawVector} shapeVel1\n     * @param {RawShape} shape2\n     * @param {RawVector} shapePos2\n     * @param {RawRotation} shapeRot2\n     * @param {RawVector} shapeVel2\n     * @param {number} target_distance\n     * @param {number} maxToi\n     * @param {boolean} stop_at_penetration\n     * @returns {RawShapeCastHit | undefined}\n     */\n    castShape(shapePos1, shapeRot1, shapeVel1, shape2, shapePos2, shapeRot2, shapeVel2, target_distance, maxToi, stop_at_penetration) {\n        _assertClass(shapePos1, RawVector);\n        _assertClass(shapeRot1, RawRotation);\n        _assertClass(shapeVel1, RawVector);\n        _assertClass(shape2, RawShape);\n        _assertClass(shapePos2, RawVector);\n        _assertClass(shapeRot2, RawRotation);\n        _assertClass(shapeVel2, RawVector);\n        const ret = wasm.rawshape_castShape(this.__wbg_ptr, shapePos1.__wbg_ptr, shapeRot1.__wbg_ptr, shapeVel1.__wbg_ptr, shape2.__wbg_ptr, shapePos2.__wbg_ptr, shapeRot2.__wbg_ptr, shapeVel2.__wbg_ptr, target_distance, maxToi, stop_at_penetration);\n        return ret === 0 ? undefined : RawShapeCastHit.__wrap(ret);\n    }\n    /**\n     * @returns {number | undefined}\n     */\n    compoundFlags() {\n        const ret = wasm.rawshape_compoundFlags(this.__wbg_ptr);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @returns {number | undefined}\n     */\n    compoundLen() {\n        const ret = wasm.rawshape_compoundLen(this.__wbg_ptr);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} index\n     * @returns {RawRotation | undefined}\n     */\n    compoundRotation(index) {\n        const ret = wasm.rawshape_compoundRotation(this.__wbg_ptr, index);\n        return ret === 0 ? undefined : RawRotation.__wrap(ret);\n    }\n    /**\n     * @param {number} index\n     * @returns {RawShape | undefined}\n     */\n    compoundShape(index) {\n        const ret = wasm.rawshape_compoundShape(this.__wbg_ptr, index);\n        return ret === 0 ? undefined : RawShape.__wrap(ret);\n    }\n    /**\n     * @param {number} index\n     * @returns {RawVector | undefined}\n     */\n    compoundTranslation(index) {\n        const ret = wasm.rawshape_compoundTranslation(this.__wbg_ptr, index);\n        return ret === 0 ? undefined : RawVector.__wrap(ret);\n    }\n    /**\n     * @param {RawShape[]} shapes\n     * @param {Float32Array} positions\n     * @param {Float32Array} rotations\n     * @param {number} flags\n     * @returns {RawShape}\n     */\n    static compound(shapes, positions, rotations, flags) {\n        const ptr0 = passArrayJsValueToWasm0(shapes, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        const ptr1 = passArrayF32ToWasm0(positions, wasm.__wbindgen_export3);\n        const len1 = WASM_VECTOR_LEN;\n        const ptr2 = passArrayF32ToWasm0(rotations, wasm.__wbindgen_export3);\n        const len2 = WASM_VECTOR_LEN;\n        const ret = wasm.rawshape_compound(ptr0, len0, ptr1, len1, ptr2, len2, flags);\n        return RawShape.__wrap(ret);\n    }\n    /**\n     * @param {number} halfHeight\n     * @param {number} radius\n     * @returns {RawShape}\n     */\n    static cone(halfHeight, radius) {\n        const ret = wasm.rawshape_cone(halfHeight, radius);\n        return RawShape.__wrap(ret);\n    }\n    /**\n     * @param {RawVector} shapePos1\n     * @param {RawRotation} shapeRot1\n     * @param {RawShape} shape2\n     * @param {RawVector} shapePos2\n     * @param {RawRotation} shapeRot2\n     * @param {number} prediction\n     * @returns {RawShapeContact | undefined}\n     */\n    contactShape(shapePos1, shapeRot1, shape2, shapePos2, shapeRot2, prediction) {\n        _assertClass(shapePos1, RawVector);\n        _assertClass(shapeRot1, RawRotation);\n        _assertClass(shape2, RawShape);\n        _assertClass(shapePos2, RawVector);\n        _assertClass(shapeRot2, RawRotation);\n        const ret = wasm.rawshape_contactShape(this.__wbg_ptr, shapePos1.__wbg_ptr, shapeRot1.__wbg_ptr, shape2.__wbg_ptr, shapePos2.__wbg_ptr, shapeRot2.__wbg_ptr, prediction);\n        return ret === 0 ? undefined : RawShapeContact.__wrap(ret);\n    }\n    /**\n     * @param {RawVector} shapePos\n     * @param {RawRotation} shapeRot\n     * @param {RawVector} point\n     * @returns {boolean}\n     */\n    containsPoint(shapePos, shapeRot, point) {\n        _assertClass(shapePos, RawVector);\n        _assertClass(shapeRot, RawRotation);\n        _assertClass(point, RawVector);\n        const ret = wasm.rawshape_containsPoint(this.__wbg_ptr, shapePos.__wbg_ptr, shapeRot.__wbg_ptr, point.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @param {Float32Array} vertices\n     * @param {Uint32Array} indices\n     * @param {RawVHACDParameters} params\n     * @param {number} flags\n     * @returns {RawShape | undefined}\n     */\n    static convexDecompositionWithParams(vertices, indices, params, flags) {\n        const ptr0 = passArrayF32ToWasm0(vertices, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        const ptr1 = passArray32ToWasm0(indices, wasm.__wbindgen_export3);\n        const len1 = WASM_VECTOR_LEN;\n        _assertClass(params, RawVHACDParameters);\n        const ret = wasm.rawshape_convexDecompositionWithParams(ptr0, len0, ptr1, len1, params.__wbg_ptr, flags);\n        return ret === 0 ? undefined : RawShape.__wrap(ret);\n    }\n    /**\n     * @param {Float32Array} vertices\n     * @param {Uint32Array} indices\n     * @param {number} flags\n     * @returns {RawShape | undefined}\n     */\n    static convexDecomposition(vertices, indices, flags) {\n        const ptr0 = passArrayF32ToWasm0(vertices, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        const ptr1 = passArray32ToWasm0(indices, wasm.__wbindgen_export3);\n        const len1 = WASM_VECTOR_LEN;\n        const ret = wasm.rawshape_convexDecomposition(ptr0, len0, ptr1, len1, flags);\n        return ret === 0 ? undefined : RawShape.__wrap(ret);\n    }\n    /**\n     * @param {Float32Array} points\n     * @returns {RawShape | undefined}\n     */\n    static convexHull(points) {\n        const ptr0 = passArrayF32ToWasm0(points, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        const ret = wasm.rawshape_convexHull(ptr0, len0);\n        return ret === 0 ? undefined : RawShape.__wrap(ret);\n    }\n    /**\n     * The vertices and indices of the convex hull of this convex polyhedron, recomputed\n     * with `try_convex_hull` so that the result can always be fed back to\n     * `RawShape::convexMesh`.\n     *\n     * This computes the convex hull only once, unlike calling both `vertices()` and\n     * `indices()`.\n     * @returns {RawConvexMeshData | undefined}\n     */\n    convexMeshData() {\n        const ret = wasm.rawshape_convexMeshData(this.__wbg_ptr);\n        return ret === 0 ? undefined : RawConvexMeshData.__wrap(ret);\n    }\n    /**\n     * @param {Float32Array} vertices\n     * @param {Uint32Array} indices\n     * @returns {RawShape | undefined}\n     */\n    static convexMesh(vertices, indices) {\n        const ptr0 = passArrayF32ToWasm0(vertices, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        const ptr1 = passArray32ToWasm0(indices, wasm.__wbindgen_export3);\n        const len1 = WASM_VECTOR_LEN;\n        const ret = wasm.rawshape_convexMesh(ptr0, len0, ptr1, len1);\n        return ret === 0 ? undefined : RawShape.__wrap(ret);\n    }\n    /**\n     * @param {number} hx\n     * @param {number} hy\n     * @param {number} hz\n     * @returns {RawShape}\n     */\n    static cuboid(hx, hy, hz) {\n        const ret = wasm.rawshape_cuboid(hx, hy, hz);\n        return RawShape.__wrap(ret);\n    }\n    /**\n     * @param {number} halfHeight\n     * @param {number} radius\n     * @returns {RawShape}\n     */\n    static cylinder(halfHeight, radius) {\n        const ret = wasm.rawshape_cylinder(halfHeight, radius);\n        return RawShape.__wrap(ret);\n    }\n    /**\n     * @returns {RawVector | undefined}\n     */\n    halfExtents() {\n        const ret = wasm.rawshape_halfExtents(this.__wbg_ptr);\n        return ret === 0 ? undefined : RawVector.__wrap(ret);\n    }\n    /**\n     * @returns {number | undefined}\n     */\n    halfHeight() {\n        const ret = wasm.rawshape_halfHeight(this.__wbg_ptr);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @returns {RawVector | undefined}\n     */\n    halfspaceNormal() {\n        const ret = wasm.rawshape_halfspaceNormal(this.__wbg_ptr);\n        return ret === 0 ? undefined : RawVector.__wrap(ret);\n    }\n    /**\n     * @param {RawVector} normal\n     * @returns {RawShape}\n     */\n    static halfspace(normal) {\n        _assertClass(normal, RawVector);\n        const ret = wasm.rawshape_halfspace(normal.__wbg_ptr);\n        return RawShape.__wrap(ret);\n    }\n    /**\n     * @returns {number | undefined}\n     */\n    heightFieldFlags() {\n        const ret = wasm.rawshape_heightFieldFlags(this.__wbg_ptr);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @returns {Float32Array | undefined}\n     */\n    heightfieldHeights() {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawshape_heightfieldHeights(retptr, this.__wbg_ptr);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            let v1;\n            if (r0 !== 0) {\n                v1 = getArrayF32FromWasm0(r0, r1).slice();\n                wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            }\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @returns {number | undefined}\n     */\n    heightfieldNCols() {\n        const ret = wasm.rawshape_heightfieldNCols(this.__wbg_ptr);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @returns {number | undefined}\n     */\n    heightfieldNRows() {\n        const ret = wasm.rawshape_heightfieldNRows(this.__wbg_ptr);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @returns {RawVector | undefined}\n     */\n    heightfieldScale() {\n        const ret = wasm.rawshape_heightfieldScale(this.__wbg_ptr);\n        return ret === 0 ? undefined : RawVector.__wrap(ret);\n    }\n    /**\n     * @param {number} nrows\n     * @param {number} ncols\n     * @param {Float32Array} heights\n     * @param {RawVector} scale\n     * @param {number} flags\n     * @returns {RawShape}\n     */\n    static heightfield(nrows, ncols, heights, scale, flags) {\n        const ptr0 = passArrayF32ToWasm0(heights, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        _assertClass(scale, RawVector);\n        const ret = wasm.rawshape_heightfield(nrows, ncols, ptr0, len0, scale.__wbg_ptr, flags);\n        return RawShape.__wrap(ret);\n    }\n    /**\n     * @returns {Uint32Array | undefined}\n     */\n    indices() {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawshape_indices(retptr, this.__wbg_ptr);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            let v1;\n            if (r0 !== 0) {\n                v1 = getArrayU32FromWasm0(r0, r1).slice();\n                wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            }\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {RawVector} shapePos\n     * @param {RawRotation} shapeRot\n     * @param {RawVector} rayOrig\n     * @param {RawVector} rayDir\n     * @param {number} maxToi\n     * @returns {boolean}\n     */\n    intersectsRay(shapePos, shapeRot, rayOrig, rayDir, maxToi) {\n        _assertClass(shapePos, RawVector);\n        _assertClass(shapeRot, RawRotation);\n        _assertClass(rayOrig, RawVector);\n        _assertClass(rayDir, RawVector);\n        const ret = wasm.rawshape_intersectsRay(this.__wbg_ptr, shapePos.__wbg_ptr, shapeRot.__wbg_ptr, rayOrig.__wbg_ptr, rayDir.__wbg_ptr, maxToi);\n        return ret !== 0;\n    }\n    /**\n     * @param {RawVector} shapePos1\n     * @param {RawRotation} shapeRot1\n     * @param {RawShape} shape2\n     * @param {RawVector} shapePos2\n     * @param {RawRotation} shapeRot2\n     * @returns {boolean}\n     */\n    intersectsShape(shapePos1, shapeRot1, shape2, shapePos2, shapeRot2) {\n        _assertClass(shapePos1, RawVector);\n        _assertClass(shapeRot1, RawRotation);\n        _assertClass(shape2, RawShape);\n        _assertClass(shapePos2, RawVector);\n        _assertClass(shapeRot2, RawRotation);\n        const ret = wasm.rawshape_intersectsShape(this.__wbg_ptr, shapePos1.__wbg_ptr, shapeRot1.__wbg_ptr, shape2.__wbg_ptr, shapePos2.__wbg_ptr, shapeRot2.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {number | undefined}\n     */\n    polylineFlags() {\n        const ret = wasm.rawshape_polylineFlags(this.__wbg_ptr);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {Float32Array} vertices\n     * @param {Uint32Array} indices\n     * @param {number} flags\n     * @returns {RawShape}\n     */\n    static polyline(vertices, indices, flags) {\n        const ptr0 = passArrayF32ToWasm0(vertices, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        const ptr1 = passArray32ToWasm0(indices, wasm.__wbindgen_export3);\n        const len1 = WASM_VECTOR_LEN;\n        const ret = wasm.rawshape_polyline(ptr0, len0, ptr1, len1, flags);\n        return RawShape.__wrap(ret);\n    }\n    /**\n     * @param {RawVector} shapePos\n     * @param {RawRotation} shapeRot\n     * @param {RawVector} point\n     * @param {boolean} solid\n     * @returns {RawPointProjection}\n     */\n    projectPoint(shapePos, shapeRot, point, solid) {\n        _assertClass(shapePos, RawVector);\n        _assertClass(shapeRot, RawRotation);\n        _assertClass(point, RawVector);\n        const ret = wasm.rawshape_projectPoint(this.__wbg_ptr, shapePos.__wbg_ptr, shapeRot.__wbg_ptr, point.__wbg_ptr, solid);\n        return RawPointProjection.__wrap(ret);\n    }\n    /**\n     * @returns {number | undefined}\n     */\n    radius() {\n        const ret = wasm.rawshape_radius(this.__wbg_ptr);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} halfHeight\n     * @param {number} radius\n     * @param {number} borderRadius\n     * @returns {RawShape}\n     */\n    static roundCone(halfHeight, radius, borderRadius) {\n        const ret = wasm.rawshape_roundCone(halfHeight, radius, borderRadius);\n        return RawShape.__wrap(ret);\n    }\n    /**\n     * @param {Float32Array} points\n     * @param {number} borderRadius\n     * @returns {RawShape | undefined}\n     */\n    static roundConvexHull(points, borderRadius) {\n        const ptr0 = passArrayF32ToWasm0(points, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        const ret = wasm.rawshape_roundConvexHull(ptr0, len0, borderRadius);\n        return ret === 0 ? undefined : RawShape.__wrap(ret);\n    }\n    /**\n     * @param {Float32Array} vertices\n     * @param {Uint32Array} indices\n     * @param {number} borderRadius\n     * @returns {RawShape | undefined}\n     */\n    static roundConvexMesh(vertices, indices, borderRadius) {\n        const ptr0 = passArrayF32ToWasm0(vertices, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        const ptr1 = passArray32ToWasm0(indices, wasm.__wbindgen_export3);\n        const len1 = WASM_VECTOR_LEN;\n        const ret = wasm.rawshape_roundConvexMesh(ptr0, len0, ptr1, len1, borderRadius);\n        return ret === 0 ? undefined : RawShape.__wrap(ret);\n    }\n    /**\n     * @param {number} hx\n     * @param {number} hy\n     * @param {number} hz\n     * @param {number} borderRadius\n     * @returns {RawShape}\n     */\n    static roundCuboid(hx, hy, hz, borderRadius) {\n        const ret = wasm.rawshape_roundCuboid(hx, hy, hz, borderRadius);\n        return RawShape.__wrap(ret);\n    }\n    /**\n     * @param {number} halfHeight\n     * @param {number} radius\n     * @param {number} borderRadius\n     * @returns {RawShape}\n     */\n    static roundCylinder(halfHeight, radius, borderRadius) {\n        const ret = wasm.rawshape_roundCylinder(halfHeight, radius, borderRadius);\n        return RawShape.__wrap(ret);\n    }\n    /**\n     * @returns {number | undefined}\n     */\n    roundRadius() {\n        const ret = wasm.rawshape_roundRadius(this.__wbg_ptr);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {RawVector} p1\n     * @param {RawVector} p2\n     * @param {RawVector} p3\n     * @param {number} borderRadius\n     * @returns {RawShape}\n     */\n    static roundTriangle(p1, p2, p3, borderRadius) {\n        _assertClass(p1, RawVector);\n        _assertClass(p2, RawVector);\n        _assertClass(p3, RawVector);\n        const ret = wasm.rawshape_roundTriangle(p1.__wbg_ptr, p2.__wbg_ptr, p3.__wbg_ptr, borderRadius);\n        return RawShape.__wrap(ret);\n    }\n    /**\n     * @param {RawVector} p1\n     * @param {RawVector} p2\n     * @returns {RawShape}\n     */\n    static segment(p1, p2) {\n        _assertClass(p1, RawVector);\n        _assertClass(p2, RawVector);\n        const ret = wasm.rawshape_segment(p1.__wbg_ptr, p2.__wbg_ptr);\n        return RawShape.__wrap(ret);\n    }\n    /**\n     * @returns {RawShapeType}\n     */\n    shapeType() {\n        const ret = wasm.rawshape_shapeType(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number | undefined}\n     */\n    triMeshFlags() {\n        const ret = wasm.rawshape_triMeshFlags(this.__wbg_ptr);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {RawVector} p1\n     * @param {RawVector} p2\n     * @param {RawVector} p3\n     * @returns {RawShape}\n     */\n    static triangle(p1, p2, p3) {\n        _assertClass(p1, RawVector);\n        _assertClass(p2, RawVector);\n        _assertClass(p3, RawVector);\n        const ret = wasm.rawshape_triangle(p1.__wbg_ptr, p2.__wbg_ptr, p3.__wbg_ptr);\n        return RawShape.__wrap(ret);\n    }\n    /**\n     * @param {Float32Array} vertices\n     * @param {Uint32Array} indices\n     * @param {number} flags\n     * @returns {RawShape | undefined}\n     */\n    static trimesh(vertices, indices, flags) {\n        const ptr0 = passArrayF32ToWasm0(vertices, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        const ptr1 = passArray32ToWasm0(indices, wasm.__wbindgen_export3);\n        const len1 = WASM_VECTOR_LEN;\n        const ret = wasm.rawshape_trimesh(ptr0, len0, ptr1, len1, flags);\n        return ret === 0 ? undefined : RawShape.__wrap(ret);\n    }\n    /**\n     * The vertices of this shape, if it is vertex-based.\n     *\n     * For convex polyhedra, this returns the vertices of a convex hull recomputed with\n     * `try_convex_hull` (so they may differ in count and order from the points the shape\n     * was built from), ensuring the result can be fed back to `RawShape::convexMesh`.\n     * If both `vertices` and `indices` are needed, prefer `convexMeshData` which computes\n     * the convex hull only once.\n     * @returns {Float32Array | undefined}\n     */\n    vertices() {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawshape_vertices(retptr, this.__wbg_ptr);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            let v1;\n            if (r0 !== 0) {\n                v1 = getArrayF32FromWasm0(r0, r1).slice();\n                wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            }\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @returns {Int32Array | undefined}\n     */\n    voxelData() {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawshape_voxelData(retptr, this.__wbg_ptr);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            let v1;\n            if (r0 !== 0) {\n                v1 = getArrayI32FromWasm0(r0, r1).slice();\n                wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            }\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @returns {RawVector | undefined}\n     */\n    voxelSize() {\n        const ret = wasm.rawshape_voxelSize(this.__wbg_ptr);\n        return ret === 0 ? undefined : RawVector.__wrap(ret);\n    }\n    /**\n     * @param {RawVector} voxel_size\n     * @param {Float32Array} points\n     * @returns {RawShape}\n     */\n    static voxelsFromPoints(voxel_size, points) {\n        _assertClass(voxel_size, RawVector);\n        const ptr0 = passArrayF32ToWasm0(points, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        const ret = wasm.rawshape_voxelsFromPoints(voxel_size.__wbg_ptr, ptr0, len0);\n        return RawShape.__wrap(ret);\n    }\n    /**\n     * @param {RawVector} voxel_size\n     * @param {Int32Array} grid_coords\n     * @returns {RawShape}\n     */\n    static voxels(voxel_size, grid_coords) {\n        _assertClass(voxel_size, RawVector);\n        const ptr0 = passArray32ToWasm0(grid_coords, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        const ret = wasm.rawshape_voxels(voxel_size.__wbg_ptr, ptr0, len0);\n        return RawShape.__wrap(ret);\n    }\n}\nif (Symbol.dispose) RawShape.prototype[Symbol.dispose] = RawShape.prototype.free;\n\nexport class RawShapeCastHit {\n    static __wrap(ptr) {\n        const obj = Object.create(RawShapeCastHit.prototype);\n        obj.__wbg_ptr = ptr;\n        RawShapeCastHitFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawShapeCastHitFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawshapecasthit_free(ptr, 0);\n    }\n    /**\n     * @param {Float32Array} scratch_buffer\n     */\n    getComponents(scratch_buffer) {\n        try {\n            wasm.rawshapecasthit_getComponents(this.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n}\nif (Symbol.dispose) RawShapeCastHit.prototype[Symbol.dispose] = RawShapeCastHit.prototype.free;\n\nexport class RawShapeContact {\n    static __wrap(ptr) {\n        const obj = Object.create(RawShapeContact.prototype);\n        obj.__wbg_ptr = ptr;\n        RawShapeContactFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawShapeContactFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawshapecontact_free(ptr, 0);\n    }\n    /**\n     * Writes the contact components into the given scratch buffer.\n     *\n     * Layout: `[distance, point1, point2, normal1, normal2]`.\n     * @param {Float32Array} scratch_buffer\n     */\n    getComponents(scratch_buffer) {\n        try {\n            wasm.rawshapecontact_getComponents(this.__wbg_ptr, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n}\nif (Symbol.dispose) RawShapeContact.prototype[Symbol.dispose] = RawShapeContact.prototype.free;\n\n/**\n * @enum {0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18}\n */\nexport const RawShapeType = Object.freeze({\n    Ball: 0, \"0\": \"Ball\",\n    Cuboid: 1, \"1\": \"Cuboid\",\n    Capsule: 2, \"2\": \"Capsule\",\n    Segment: 3, \"3\": \"Segment\",\n    Polyline: 4, \"4\": \"Polyline\",\n    Triangle: 5, \"5\": \"Triangle\",\n    TriMesh: 6, \"6\": \"TriMesh\",\n    HeightField: 7, \"7\": \"HeightField\",\n    Compound: 8, \"8\": \"Compound\",\n    ConvexPolyhedron: 9, \"9\": \"ConvexPolyhedron\",\n    Cylinder: 10, \"10\": \"Cylinder\",\n    Cone: 11, \"11\": \"Cone\",\n    RoundCuboid: 12, \"12\": \"RoundCuboid\",\n    RoundTriangle: 13, \"13\": \"RoundTriangle\",\n    RoundCylinder: 14, \"14\": \"RoundCylinder\",\n    RoundCone: 15, \"15\": \"RoundCone\",\n    RoundConvexPolyhedron: 16, \"16\": \"RoundConvexPolyhedron\",\n    HalfSpace: 17, \"17\": \"HalfSpace\",\n    Voxels: 18, \"18\": \"Voxels\",\n});\n\nexport class RawSoftBodyBuilder {\n    static __wrap(ptr) {\n        const obj = Object.create(RawSoftBodyBuilder.prototype);\n        obj.__wbg_ptr = ptr;\n        RawSoftBodyBuilderFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawSoftBodyBuilderFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawsoftbodybuilder_free(ptr, 0);\n    }\n    /**\n     * @param {Uint32Array} edges\n     */\n    addEdges(edges) {\n        const ptr0 = passArray32ToWasm0(edges, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        wasm.rawsoftbodybuilder_addEdges(this.__wbg_ptr, ptr0, len0);\n    }\n    /**\n     * @param {RawSoftBodyBuilder} other\n     */\n    append(other) {\n        _assertClass(other, RawSoftBodyBuilder);\n        wasm.rawsoftbodybuilder_append(this.__wbg_ptr, other.__wbg_ptr);\n    }\n    /**\n     * @returns {Uint32Array}\n     */\n    cellEdges() {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodybuilder_cellEdges(retptr, this.__wbg_ptr);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayU32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {RawVector} origin\n     * @param {RawVector} du\n     * @param {RawVector} dv\n     * @param {number} nu\n     * @param {number} nv\n     * @param {number} warp_frequency\n     * @param {number} warp_damping\n     * @param {number} weft_frequency\n     * @param {number} weft_damping\n     * @param {number} shear_frequency\n     * @param {number} shear_damping\n     * @returns {RawSoftBodyBuilder}\n     */\n    static clothAnisotropic(origin, du, dv, nu, nv, warp_frequency, warp_damping, weft_frequency, weft_damping, shear_frequency, shear_damping) {\n        _assertClass(origin, RawVector);\n        _assertClass(du, RawVector);\n        _assertClass(dv, RawVector);\n        const ret = wasm.rawsoftbodybuilder_clothAnisotropic(origin.__wbg_ptr, du.__wbg_ptr, dv.__wbg_ptr, nu, nv, warp_frequency, warp_damping, weft_frequency, weft_damping, shear_frequency, shear_damping);\n        return RawSoftBodyBuilder.__wrap(ret);\n    }\n    /**\n     * @param {RawVector} origin\n     * @param {RawVector} axis\n     * @param {number} radius_start\n     * @param {number} radius_end\n     * @param {number} num_around\n     * @param {number} num_along\n     * @returns {RawSoftBodyBuilder}\n     */\n    static clothTube(origin, axis, radius_start, radius_end, num_around, num_along) {\n        _assertClass(origin, RawVector);\n        _assertClass(axis, RawVector);\n        const ret = wasm.rawsoftbodybuilder_clothTube(origin.__wbg_ptr, axis.__wbg_ptr, radius_start, radius_end, num_around, num_along);\n        return RawSoftBodyBuilder.__wrap(ret);\n    }\n    /**\n     * @param {RawVector} origin\n     * @param {RawVector} du\n     * @param {RawVector} dv\n     * @param {number} nu\n     * @param {number} nv\n     * @returns {RawSoftBodyBuilder}\n     */\n    static cloth(origin, du, dv, nu, nv) {\n        _assertClass(origin, RawVector);\n        _assertClass(du, RawVector);\n        _assertClass(dv, RawVector);\n        const ret = wasm.rawsoftbodybuilder_cloth(origin.__wbg_ptr, du.__wbg_ptr, dv.__wbg_ptr, nu, nv);\n        return RawSoftBodyBuilder.__wrap(ret);\n    }\n    /**\n     * @param {RawVector} center\n     * @param {RawVector} half_extents\n     * @param {number} nx\n     * @param {number} ny\n     * @param {number} nz\n     * @returns {RawSoftBodyBuilder}\n     */\n    static cuboid(center, half_extents, nx, ny, nz) {\n        _assertClass(center, RawVector);\n        _assertClass(half_extents, RawVector);\n        const ret = wasm.rawsoftbodybuilder_cuboid(center.__wbg_ptr, half_extents.__wbg_ptr, nx, ny, nz);\n        return RawSoftBodyBuilder.__wrap(ret);\n    }\n    /**\n     * @returns {RawSoftBodyMaterial}\n     */\n    material() {\n        const ret = wasm.rawsoftbodybuilder_material(this.__wbg_ptr);\n        return RawSoftBodyMaterial.__wrap(ret);\n    }\n    /**\n     * A builder over the given world-space particle positions (`DIM` floats per particle), with\n     * no element.\n     * @param {Float32Array} positions\n     */\n    constructor(positions) {\n        const ptr0 = passArrayF32ToWasm0(positions, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        const ret = wasm.rawsoftbodybuilder_new(ptr0, len0);\n        this.__wbg_ptr = ret;\n        RawSoftBodyBuilderFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n    /**\n     * @returns {number}\n     */\n    numParticles() {\n        const ret = wasm.rawsoftbodybuilder_numParticles(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @returns {Float32Array}\n     */\n    particlePositions() {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodybuilder_particlePositions(retptr, this.__wbg_ptr);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayF32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {RawVector} start\n     * @param {RawVector} end\n     * @param {number} num_particles\n     * @returns {RawSoftBodyBuilder}\n     */\n    static rope(start, end, num_particles) {\n        _assertClass(start, RawVector);\n        _assertClass(end, RawVector);\n        const ret = wasm.rawsoftbodybuilder_rope(start.__wbg_ptr, end.__wbg_ptr, num_particles);\n        return RawSoftBodyBuilder.__wrap(ret);\n    }\n    /**\n     * @param {number} iterations\n     */\n    setAdditionalPgsIterations(iterations) {\n        wasm.rawsoftbodybuilder_setAdditionalPgsIterations(this.__wbg_ptr, iterations);\n    }\n    /**\n     * @param {number} iterations\n     */\n    setAdditionalSolverIterations(iterations) {\n        wasm.rawsoftbodybuilder_setAdditionalSolverIterations(this.__wbg_ptr, iterations);\n    }\n    /**\n     * @param {Uint32Array} edges\n     */\n    setBendEdges(edges) {\n        const ptr0 = passArray32ToWasm0(edges, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        wasm.rawsoftbodybuilder_setBendEdges(this.__wbg_ptr, ptr0, len0);\n    }\n    /**\n     * @param {boolean} can_sleep\n     */\n    setCanSleep(can_sleep) {\n        wasm.rawsoftbodybuilder_setCanSleep(this.__wbg_ptr, can_sleep);\n    }\n    /**\n     * @param {RawSoftBodyCellModel} model\n     */\n    setCellModel(model) {\n        wasm.rawsoftbodybuilder_setCellModel(this.__wbg_ptr, model);\n    }\n    /**\n     * @param {Uint32Array} cells\n     */\n    setCells(cells) {\n        const ptr0 = passArray32ToWasm0(cells, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        wasm.rawsoftbodybuilder_setCells(this.__wbg_ptr, ptr0, len0);\n    }\n    /**\n     * @param {Uint32Array} dihedrals\n     */\n    setDihedrals(dihedrals) {\n        const ptr0 = passArray32ToWasm0(dihedrals, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        wasm.rawsoftbodybuilder_setDihedrals(this.__wbg_ptr, ptr0, len0);\n    }\n    /**\n     * @param {number} group\n     */\n    setDominanceGroup(group) {\n        wasm.rawsoftbodybuilder_setDominanceGroup(this.__wbg_ptr, group);\n    }\n    /**\n     * @param {Uint32Array} edges\n     * @param {Float32Array} frequencies\n     * @param {Float32Array} dampings\n     */\n    setEdgeSoftness(edges, frequencies, dampings) {\n        const ptr0 = passArray32ToWasm0(edges, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        const ptr1 = passArrayF32ToWasm0(frequencies, wasm.__wbindgen_export3);\n        const len1 = WASM_VECTOR_LEN;\n        const ptr2 = passArrayF32ToWasm0(dampings, wasm.__wbindgen_export3);\n        const len2 = WASM_VECTOR_LEN;\n        wasm.rawsoftbodybuilder_setEdgeSoftness(this.__wbg_ptr, ptr0, len0, ptr1, len1, ptr2, len2);\n    }\n    /**\n     * @param {Uint32Array} edges\n     * @param {Float32Array} resistances\n     */\n    setEdgeTearResistance(edges, resistances) {\n        const ptr0 = passArray32ToWasm0(edges, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        const ptr1 = passArrayF32ToWasm0(resistances, wasm.__wbindgen_export3);\n        const len1 = WASM_VECTOR_LEN;\n        wasm.rawsoftbodybuilder_setEdgeTearResistance(this.__wbg_ptr, ptr0, len0, ptr1, len1);\n    }\n    /**\n     * @param {Uint32Array} edges\n     */\n    setEdges(edges) {\n        const ptr0 = passArray32ToWasm0(edges, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        wasm.rawsoftbodybuilder_setEdges(this.__wbg_ptr, ptr0, len0);\n    }\n    /**\n     * @param {number} scale\n     */\n    setGravityScale(scale) {\n        wasm.rawsoftbodybuilder_setGravityScale(this.__wbg_ptr, scale);\n    }\n    /**\n     * @param {number} damping\n     */\n    setLinearDamping(damping) {\n        wasm.rawsoftbodybuilder_setLinearDamping(this.__wbg_ptr, damping);\n    }\n    /**\n     * @param {number} mass\n     */\n    setMass(mass) {\n        wasm.rawsoftbodybuilder_setMass(this.__wbg_ptr, mass);\n    }\n    /**\n     * @param {Float32Array} masses\n     */\n    setMasses(masses) {\n        const ptr0 = passArrayF32ToWasm0(masses, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        wasm.rawsoftbodybuilder_setMasses(this.__wbg_ptr, ptr0, len0);\n    }\n    /**\n     * @param {RawSoftBodyMaterial} material\n     */\n    setMaterial(material) {\n        _assertClass(material, RawSoftBodyMaterial);\n        wasm.rawsoftbodybuilder_setMaterial(this.__wbg_ptr, material.__wbg_ptr);\n    }\n    setNoSurfaceCollider() {\n        wasm.rawsoftbodybuilder_setNoSurfaceCollider(this.__wbg_ptr);\n    }\n    /**\n     * @param {boolean} oriented\n     */\n    setOriented(oriented) {\n        wasm.rawsoftbodybuilder_setOriented(this.__wbg_ptr, oriented);\n    }\n    /**\n     * @param {number} mass\n     */\n    setParticleMass(mass) {\n        wasm.rawsoftbodybuilder_setParticleMass(this.__wbg_ptr, mass);\n    }\n    /**\n     * @param {number} radius\n     */\n    setParticleRadius(radius) {\n        wasm.rawsoftbodybuilder_setParticleRadius(this.__wbg_ptr, radius);\n    }\n    /**\n     * @param {Uint32Array} pinned\n     */\n    setPinnedParticles(pinned) {\n        const ptr0 = passArray32ToWasm0(pinned, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        wasm.rawsoftbodybuilder_setPinnedParticles(this.__wbg_ptr, ptr0, len0);\n    }\n    /**\n     * @param {Float32Array} positions\n     */\n    setPositions(positions) {\n        const ptr0 = passArrayF32ToWasm0(positions, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        wasm.rawsoftbodybuilder_setPositions(this.__wbg_ptr, ptr0, len0);\n    }\n    /**\n     * @param {boolean} enabled\n     */\n    setSelfContacts(enabled) {\n        wasm.rawsoftbodybuilder_setSelfContacts(this.__wbg_ptr, enabled);\n    }\n    /**\n     * @param {boolean} enabled\n     */\n    setShapeMatching(enabled) {\n        wasm.rawsoftbodybuilder_setShapeMatching(this.__wbg_ptr, enabled);\n    }\n    /**\n     * @param {boolean} enabled\n     */\n    setSkinCollision(enabled) {\n        wasm.rawsoftbodybuilder_setSkinCollision(this.__wbg_ptr, enabled);\n    }\n    /**\n     * @param {Float32Array} vertices\n     * @param {Uint32Array} indices\n     */\n    setSkin(vertices, indices) {\n        const ptr0 = passArrayF32ToWasm0(vertices, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        const ptr1 = passArray32ToWasm0(indices, wasm.__wbindgen_export3);\n        const len1 = WASM_VECTOR_LEN;\n        wasm.rawsoftbodybuilder_setSkin(this.__wbg_ptr, ptr0, len0, ptr1, len1);\n    }\n    /**\n     * @param {number} natural_frequency\n     * @param {number} damping_ratio\n     */\n    setSoftness(natural_frequency, damping_ratio) {\n        wasm.rawsoftbodybuilder_setSoftness(this.__wbg_ptr, natural_frequency, damping_ratio);\n    }\n    /**\n     * @param {RawSoftBodySolver} solver\n     */\n    setSolver(solver) {\n        wasm.rawsoftbodybuilder_setSolver(this.__wbg_ptr, solver);\n    }\n    /**\n     * The template of the body's colliders: its shape is replaced by the deformable surface,\n     * or by a ball of `particleRadius` for a body colliding through its particles.\n     * @param {number} friction\n     * @param {number} restitution\n     * @param {number} frictionCombineRule\n     * @param {number} restitutionCombineRule\n     * @param {boolean} isSensor\n     * @param {number} collisionGroups\n     * @param {number} solverGroups\n     * @param {number} activeCollisionTypes\n     * @param {number} activeHooks\n     * @param {number} activeEvents\n     * @param {number} contactForceEventThreshold\n     * @param {number} contactSkin\n     */\n    setSurfaceCollider(friction, restitution, frictionCombineRule, restitutionCombineRule, isSensor, collisionGroups, solverGroups, activeCollisionTypes, activeHooks, activeEvents, contactForceEventThreshold, contactSkin) {\n        wasm.rawsoftbodybuilder_setSurfaceCollider(this.__wbg_ptr, friction, restitution, frictionCombineRule, restitutionCombineRule, isSensor, collisionGroups, solverGroups, activeCollisionTypes, activeHooks, activeEvents, contactForceEventThreshold, contactSkin);\n    }\n    /**\n     * @param {Uint32Array} surface\n     */\n    setSurface(surface) {\n        const ptr0 = passArray32ToWasm0(surface, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        wasm.rawsoftbodybuilder_setSurface(this.__wbg_ptr, ptr0, len0);\n    }\n    setTensionOnly() {\n        wasm.rawsoftbodybuilder_setTensionOnly(this.__wbg_ptr);\n    }\n    /**\n     * @param {number} factor\n     */\n    setVolumeFactor(factor) {\n        wasm.rawsoftbodybuilder_setVolumeFactor(this.__wbg_ptr, factor);\n    }\n    /**\n     * @param {boolean} enabled\n     */\n    setVolumePreservation(enabled) {\n        wasm.rawsoftbodybuilder_setVolumePreservation(this.__wbg_ptr, enabled);\n    }\n    /**\n     * @param {Uint32Array} segments\n     */\n    setWire(segments) {\n        const ptr0 = passArray32ToWasm0(segments, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        wasm.rawsoftbodybuilder_setWire(this.__wbg_ptr, ptr0, len0);\n    }\n    /**\n     * @param {RawVector} center\n     * @param {number} radius\n     * @param {number} subdivisions\n     * @returns {RawSoftBodyBuilder}\n     */\n    static sphere(center, radius, subdivisions) {\n        _assertClass(center, RawVector);\n        const ret = wasm.rawsoftbodybuilder_sphere(center.__wbg_ptr, radius, subdivisions);\n        return RawSoftBodyBuilder.__wrap(ret);\n    }\n    /**\n     * @returns {Uint32Array}\n     */\n    surfaceDihedrals() {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodybuilder_surfaceDihedrals(retptr, this.__wbg_ptr);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayU32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @returns {Uint32Array}\n     */\n    surfaceEdges() {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodybuilder_surfaceEdges(retptr, this.__wbg_ptr);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayU32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {RawVector} translation\n     */\n    translated(translation) {\n        _assertClass(translation, RawVector);\n        wasm.rawsoftbodybuilder_translated(this.__wbg_ptr, translation.__wbg_ptr);\n    }\n    /**\n     * @param {Float32Array} vertices\n     * @param {Uint32Array} indices\n     * @returns {RawSoftBodyBuilder | undefined}\n     */\n    static trimesh(vertices, indices) {\n        const ptr0 = passArrayF32ToWasm0(vertices, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        const ptr1 = passArray32ToWasm0(indices, wasm.__wbindgen_export3);\n        const len1 = WASM_VECTOR_LEN;\n        const ret = wasm.rawsoftbodybuilder_trimesh(ptr0, len0, ptr1, len1);\n        return ret === 0 ? undefined : RawSoftBodyBuilder.__wrap(ret);\n    }\n    /**\n     * A volumetric body filling the closed surface (segments in 2D, triangles in 3D) with\n     * cells of the given size.\n     * @param {Float32Array} vertices\n     * @param {Uint32Array} indices\n     * @param {number} cell_size\n     * @param {boolean} skinned\n     * @returns {RawSoftBodyBuilder | undefined}\n     */\n    static volumetric(vertices, indices, cell_size, skinned) {\n        const ptr0 = passArrayF32ToWasm0(vertices, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        const ptr1 = passArray32ToWasm0(indices, wasm.__wbindgen_export3);\n        const len1 = WASM_VECTOR_LEN;\n        const ret = wasm.rawsoftbodybuilder_volumetric(ptr0, len0, ptr1, len1, cell_size, skinned);\n        return ret === 0 ? undefined : RawSoftBodyBuilder.__wrap(ret);\n    }\n}\nif (Symbol.dispose) RawSoftBodyBuilder.prototype[Symbol.dispose] = RawSoftBodyBuilder.prototype.free;\n\n/**\n * @enum {0 | 1 | 2}\n */\nexport const RawSoftBodyCellModel = Object.freeze({\n    Volume: 0, \"0\": \"Volume\",\n    Corotational: 1, \"1\": \"Corotational\",\n    NeoHookean: 2, \"2\": \"NeoHookean\",\n});\n\nexport class RawSoftBodyMaterial {\n    static __wrap(ptr) {\n        const obj = Object.create(RawSoftBodyMaterial.prototype);\n        obj.__wbg_ptr = ptr;\n        RawSoftBodyMaterialFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawSoftBodyMaterialFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawsoftbodymaterial_free(ptr, 0);\n    }\n    /**\n     * @returns {number}\n     */\n    get bendDampingRatio() {\n        const ret = wasm.rawsoftbodymaterial_bendDampingRatio(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get bendFrequency() {\n        const ret = wasm.rawsoftbodymaterial_bendFrequency(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get deformationDamping() {\n        const ret = wasm.rawsoftbodymaterial_deformationDamping(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get edgeDampingRatio() {\n        const ret = wasm.rawsoftbodymaterial_edgeDampingRatio(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get edgeFrequency() {\n        const ret = wasm.rawsoftbodymaterial_edgeFrequency(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get edgePlasticCreep() {\n        const ret = wasm.rawsoftbodymaterial_edgePlasticCreep(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {RawSoftEdgePlasticFlow}\n     */\n    get edgePlasticFlow() {\n        const ret = wasm.rawsoftbodymaterial_edgePlasticFlow(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get edgePlasticMax() {\n        const ret = wasm.rawsoftbodymaterial_edgePlasticMax(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get edgePlasticYield() {\n        const ret = wasm.rawsoftbodymaterial_edgePlasticYield(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get elasticDampingRatio() {\n        const ret = wasm.rawsoftbodymaterial_elasticDampingRatio(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get interiorStrength() {\n        const ret = wasm.rawsoftbodymaterial_interiorStrength(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get maxTearsPerStep() {\n        const ret = wasm.rawsoftbodymaterial_maxTearsPerStep(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @returns {number | undefined}\n     */\n    get minPiece() {\n        const ret = wasm.rawsoftbodymaterial_minPiece(this.__wbg_ptr);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    constructor() {\n        const ret = wasm.rawsoftbodymaterial_new();\n        this.__wbg_ptr = ret;\n        RawSoftBodyMaterialFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n    /**\n     * @returns {number}\n     */\n    get plasticCreep() {\n        const ret = wasm.rawsoftbodymaterial_plasticCreep(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get plasticMax() {\n        const ret = wasm.rawsoftbodymaterial_plasticMax(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get plasticYield() {\n        const ret = wasm.rawsoftbodymaterial_plasticYield(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get poissonRatio() {\n        const ret = wasm.rawsoftbodymaterial_poissonRatio(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @param {number} value\n     */\n    set bendDampingRatio(value) {\n        wasm.rawsoftbodymaterial_set_bendDampingRatio(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set bendFrequency(value) {\n        wasm.rawsoftbodymaterial_set_bendFrequency(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set deformationDamping(value) {\n        wasm.rawsoftbodymaterial_set_deformationDamping(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set edgeDampingRatio(value) {\n        wasm.rawsoftbodymaterial_set_edgeDampingRatio(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set edgeFrequency(value) {\n        wasm.rawsoftbodymaterial_set_edgeFrequency(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set edgePlasticCreep(value) {\n        wasm.rawsoftbodymaterial_set_edgePlasticCreep(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {RawSoftEdgePlasticFlow} value\n     */\n    set edgePlasticFlow(value) {\n        wasm.rawsoftbodymaterial_set_edgePlasticFlow(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set edgePlasticMax(value) {\n        wasm.rawsoftbodymaterial_set_edgePlasticMax(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set edgePlasticYield(value) {\n        wasm.rawsoftbodymaterial_set_edgePlasticYield(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set elasticDampingRatio(value) {\n        wasm.rawsoftbodymaterial_set_elasticDampingRatio(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set interiorStrength(value) {\n        wasm.rawsoftbodymaterial_set_interiorStrength(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set maxTearsPerStep(value) {\n        wasm.rawsoftbodymaterial_set_maxTearsPerStep(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number | null} [value]\n     */\n    set minPiece(value) {\n        wasm.rawsoftbodymaterial_set_minPiece(this.__wbg_ptr, isLikeNone(value) ? Number.MAX_SAFE_INTEGER : (value) >>> 0);\n    }\n    /**\n     * @param {number} value\n     */\n    set plasticCreep(value) {\n        wasm.rawsoftbodymaterial_set_plasticCreep(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set plasticMax(value) {\n        wasm.rawsoftbodymaterial_set_plasticMax(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set plasticYield(value) {\n        wasm.rawsoftbodymaterial_set_plasticYield(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set poissonRatio(value) {\n        wasm.rawsoftbodymaterial_set_poissonRatio(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set shapeMatchingDampingRatio(value) {\n        wasm.rawsoftbodymaterial_set_shapeMatchingDampingRatio(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set shapeMatchingFrequency(value) {\n        wasm.rawsoftbodymaterial_set_shapeMatchingFrequency(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number | null} [value]\n     */\n    set tearForce(value) {\n        wasm.rawsoftbodymaterial_set_tearForce(this.__wbg_ptr, isLikeNone(value) ? Number.MAX_SAFE_INTEGER : Math.fround(value));\n    }\n    /**\n     * @param {number} value\n     */\n    set tearSmoothing(value) {\n        wasm.rawsoftbodymaterial_set_tearSmoothing(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number | null} [value]\n     */\n    set tearStrain(value) {\n        wasm.rawsoftbodymaterial_set_tearStrain(this.__wbg_ptr, isLikeNone(value) ? Number.MAX_SAFE_INTEGER : Math.fround(value));\n    }\n    /**\n     * @param {number} value\n     */\n    set volumeDampingRatio(value) {\n        wasm.rawsoftbodymaterial_set_volumeDampingRatio(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set volumeFrequency(value) {\n        wasm.rawsoftbodymaterial_set_volumeFrequency(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set youngModulus(value) {\n        wasm.rawsoftbodymaterial_set_youngModulus(this.__wbg_ptr, value);\n    }\n    /**\n     * @returns {number}\n     */\n    get shapeMatchingDampingRatio() {\n        const ret = wasm.rawsoftbodymaterial_shapeMatchingDampingRatio(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get shapeMatchingFrequency() {\n        const ret = wasm.rawsoftbodymaterial_shapeMatchingFrequency(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number | undefined}\n     */\n    get tearForce() {\n        const ret = wasm.rawsoftbodymaterial_tearForce(this.__wbg_ptr);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get tearSmoothing() {\n        const ret = wasm.rawsoftbodymaterial_tearSmoothing(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number | undefined}\n     */\n    get tearStrain() {\n        const ret = wasm.rawsoftbodymaterial_tearStrain(this.__wbg_ptr);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @returns {boolean}\n     */\n    tears() {\n        const ret = wasm.rawsoftbodymaterial_tears(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @param {number} natural_frequency\n     * @param {number} damping_ratio\n     * @returns {RawSoftBodyMaterial}\n     */\n    static uniform(natural_frequency, damping_ratio) {\n        const ret = wasm.rawsoftbodymaterial_uniform(natural_frequency, damping_ratio);\n        return RawSoftBodyMaterial.__wrap(ret);\n    }\n    /**\n     * @returns {number}\n     */\n    get volumeDampingRatio() {\n        const ret = wasm.rawsoftbodymaterial_volumeDampingRatio(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get volumeFrequency() {\n        const ret = wasm.rawsoftbodymaterial_volumeFrequency(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get youngModulus() {\n        const ret = wasm.rawsoftbodymaterial_youngModulus(this.__wbg_ptr);\n        return ret;\n    }\n}\nif (Symbol.dispose) RawSoftBodyMaterial.prototype[Symbol.dispose] = RawSoftBodyMaterial.prototype.free;\n\nexport class RawSoftBodySet {\n    static __wrap(ptr) {\n        const obj = Object.create(RawSoftBodySet.prototype);\n        obj.__wbg_ptr = ptr;\n        RawSoftBodySetFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawSoftBodySetFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawsoftbodyset_free(ptr, 0);\n    }\n    /**\n     * @param {number} handle\n     * @param {Uint32Array} particles\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @returns {number | undefined}\n     */\n    addCluster(handle, particles, bodies, colliders) {\n        const ptr0 = passArray32ToWasm0(particles, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        _assertClass(bodies, RawRigidBodySet);\n        _assertClass(colliders, RawColliderSet);\n        const ret = wasm.rawsoftbodyset_addCluster(this.__wbg_ptr, handle, ptr0, len0, bodies.__wbg_ptr, colliders.__wbg_ptr);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * Checks if a soft body with the given integer handle exists.\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    contains(handle) {\n        const ret = wasm.rawsoftbodyset_contains(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * Cuts a soft body along a blade: a segment (two points) in 2D, a triangle (three points)\n     * in 3D, given as `DIM` floats per point.\n     * @param {number} handle\n     * @param {Float32Array} blade\n     * @param {RawIslandManager} islands\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @param {RawImpulseJointSet} joints\n     * @param {RawMultibodyJointSet} articulations\n     * @returns {RawSoftBodyTearEvent | undefined}\n     */\n    cut(handle, blade, islands, bodies, colliders, joints, articulations) {\n        const ptr0 = passArrayF32ToWasm0(blade, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        _assertClass(islands, RawIslandManager);\n        _assertClass(bodies, RawRigidBodySet);\n        _assertClass(colliders, RawColliderSet);\n        _assertClass(joints, RawImpulseJointSet);\n        _assertClass(articulations, RawMultibodyJointSet);\n        const ret = wasm.rawsoftbodyset_cut(this.__wbg_ptr, handle, ptr0, len0, islands.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr, joints.__wbg_ptr, articulations.__wbg_ptr);\n        return ret === 0 ? undefined : RawSoftBodyTearEvent.__wrap(ret);\n    }\n    /**\n     * Applies the given JavaScript function to the integer handle of each soft body managed by\n     * this set.\n     * @param {Function} f\n     */\n    forEachSoftBodyHandle(f) {\n        try {\n            wasm.rawsoftbodyset_forEachSoftBodyHandle(this.__wbg_ptr, addBorrowedObject(f));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * Inserts the soft body described by the builder, creating its hidden root rigid body and\n     * its colliders.\n     * @param {RawSoftBodyBuilder} builder\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @returns {number}\n     */\n    insert(builder, bodies, colliders) {\n        _assertClass(builder, RawSoftBodyBuilder);\n        _assertClass(bodies, RawRigidBodySet);\n        _assertClass(colliders, RawColliderSet);\n        const ret = wasm.rawsoftbodyset_insert(this.__wbg_ptr, builder.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * The number of soft bodies on this set.\n     * @returns {number}\n     */\n    len() {\n        const ret = wasm.rawsoftbodyset_len(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    constructor() {\n        const ret = wasm.rawsoftbodyset_new();\n        this.__wbg_ptr = ret;\n        RawSoftBodySetFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} cluster\n     * @param {RawIslandManager} islands\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @param {RawImpulseJointSet} joints\n     * @param {RawMultibodyJointSet} articulations\n     * @returns {boolean}\n     */\n    removeCluster(handle, cluster, islands, bodies, colliders, joints, articulations) {\n        _assertClass(islands, RawIslandManager);\n        _assertClass(bodies, RawRigidBodySet);\n        _assertClass(colliders, RawColliderSet);\n        _assertClass(joints, RawImpulseJointSet);\n        _assertClass(articulations, RawMultibodyJointSet);\n        const ret = wasm.rawsoftbodyset_removeCluster(this.__wbg_ptr, handle, cluster, islands.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr, joints.__wbg_ptr, articulations.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @param {number} handle\n     * @param {RawIslandManager} islands\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @param {RawImpulseJointSet} joints\n     * @param {RawMultibodyJointSet} articulations\n     */\n    remove(handle, islands, bodies, colliders, joints, articulations) {\n        _assertClass(islands, RawIslandManager);\n        _assertClass(bodies, RawRigidBodySet);\n        _assertClass(colliders, RawColliderSet);\n        _assertClass(joints, RawImpulseJointSet);\n        _assertClass(articulations, RawMultibodyJointSet);\n        wasm.rawsoftbodyset_remove(this.__wbg_ptr, handle, islands.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr, joints.__wbg_ptr, articulations.__wbg_ptr);\n    }\n    /**\n     * @param {number} handle\n     * @param {RawVector} force\n     * @param {boolean} wake_up\n     */\n    sbAddForce(handle, force, wake_up) {\n        _assertClass(force, RawVector);\n        wasm.rawsoftbodyset_sbAddForce(this.__wbg_ptr, handle, force.__wbg_ptr, wake_up);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @param {RawVector} force\n     * @param {boolean} wake_up\n     */\n    sbAddParticleForce(handle, i, force, wake_up) {\n        _assertClass(force, RawVector);\n        wasm.rawsoftbodyset_sbAddParticleForce(this.__wbg_ptr, handle, i, force.__wbg_ptr, wake_up);\n    }\n    /**\n     * @param {number} handle\n     * @param {RawVector} impulse\n     * @param {RawVector} point\n     * @param {number} falloff_radius\n     * @param {boolean} wake_up\n     */\n    sbApplyImpulseAtPoint(handle, impulse, point, falloff_radius, wake_up) {\n        _assertClass(impulse, RawVector);\n        _assertClass(point, RawVector);\n        wasm.rawsoftbodyset_sbApplyImpulseAtPoint(this.__wbg_ptr, handle, impulse.__wbg_ptr, point.__wbg_ptr, falloff_radius, wake_up);\n    }\n    /**\n     * @param {number} handle\n     * @param {RawVector} impulse\n     * @param {boolean} wake_up\n     */\n    sbApplyImpulse(handle, impulse, wake_up) {\n        _assertClass(impulse, RawVector);\n        wasm.rawsoftbodyset_sbApplyImpulse(this.__wbg_ptr, handle, impulse.__wbg_ptr, wake_up);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @param {RawVector} impulse\n     * @param {boolean} wake_up\n     */\n    sbApplyParticleImpulse(handle, i, impulse, wake_up) {\n        _assertClass(impulse, RawVector);\n        wasm.rawsoftbodyset_sbApplyParticleImpulse(this.__wbg_ptr, handle, i, impulse.__wbg_ptr, wake_up);\n    }\n    /**\n     * @param {number} handle\n     * @param {RawVector} center\n     * @param {number} magnitude\n     * @param {number} falloff_radius\n     * @param {boolean} wake_up\n     */\n    sbApplyRadialImpulse(handle, center, magnitude, falloff_radius, wake_up) {\n        _assertClass(center, RawVector);\n        wasm.rawsoftbodyset_sbApplyRadialImpulse(this.__wbg_ptr, handle, center.__wbg_ptr, magnitude, falloff_radius, wake_up);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @param {number} body\n     * @param {RawRigidBodySet} bodies\n     */\n    sbAttachParticle(handle, i, body, bodies) {\n        _assertClass(bodies, RawRigidBodySet);\n        wasm.rawsoftbodyset_sbAttachParticle(this.__wbg_ptr, handle, i, body, bodies.__wbg_ptr);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {number}\n     */\n    sbAttachmentBody(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbAttachmentBody(this.__wbg_ptr, handle, i);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {number}\n     */\n    sbAttachmentParticle(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbAttachmentParticle(this.__wbg_ptr, handle, i);\n        return ret >>> 0;\n    }\n    /**\n     * The boundary elements of the body (segments in 2D, triangles in 3D), `DIM` particle\n     * indices per element.\n     * @param {number} handle\n     * @returns {Uint32Array}\n     */\n    sbBoundary(handle) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodyset_sbBoundary(retptr, this.__wbg_ptr, handle);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayU32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} handle\n     * @returns {RawSoftBodyCellModel}\n     */\n    sbCellModel(handle) {\n        const ret = wasm.rawsoftbodyset_sbCellModel(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {number}\n     */\n    sbCellRestVolume(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbCellRestVolume(this.__wbg_ptr, handle, i);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {number}\n     */\n    sbCellStiffnessScale(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbCellStiffnessScale(this.__wbg_ptr, handle, i);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {number}\n     */\n    sbCellStress(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbCellStress(this.__wbg_ptr, handle, i);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {number}\n     */\n    sbCellTearResistance(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbCellTearResistance(this.__wbg_ptr, handle, i);\n        return ret;\n    }\n    /**\n     * The particles of every cell, `DIM + 1` indices per cell.\n     * @param {number} handle\n     * @returns {Uint32Array}\n     */\n    sbCells(handle) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodyset_sbCells(retptr, this.__wbg_ptr, handle);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayU32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} handle\n     * @param {Float32Array} scratch_buffer\n     */\n    sbCenterOfMass(handle, scratch_buffer) {\n        try {\n            wasm.rawsoftbodyset_sbCenterOfMass(this.__wbg_ptr, handle, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {Uint32Array}\n     */\n    sbClusterParticles(handle, i) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodyset_sbClusterParticles(retptr, this.__wbg_ptr, handle, i);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayU32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    sbClusterProxy(handle, i) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodyset_sbClusterProxy(retptr, this.__wbg_ptr, handle, i);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r2 = getDataViewMemory0().getFloat64(retptr + 8 * 1, true);\n            return r0 === 0 ? undefined : r2;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {boolean}\n     */\n    sbClusterShapeMatchingEnabled(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbClusterShapeMatchingEnabled(this.__wbg_ptr, handle, i);\n        return ret !== 0;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {boolean}\n     */\n    sbDetachParticle(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbDetachParticle(this.__wbg_ptr, handle, i);\n        return ret !== 0;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {number}\n     */\n    sbDihedralRestAngle(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbDihedralRestAngle(this.__wbg_ptr, handle, i);\n        return ret;\n    }\n    /**\n     * The particles of every dihedral (3D), four indices per dihedral.\n     * @param {number} handle\n     * @returns {Uint32Array}\n     */\n    sbDihedrals(handle) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodyset_sbDihedrals(retptr, this.__wbg_ptr, handle);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayU32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {number}\n     */\n    sbEdgeImpulse(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbEdgeImpulse(this.__wbg_ptr, handle, i);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {boolean}\n     */\n    sbEdgeIsBend(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbEdgeIsBend(this.__wbg_ptr, handle, i);\n        return ret !== 0;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {number}\n     */\n    sbEdgePlasticStrain(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbEdgePlasticStrain(this.__wbg_ptr, handle, i);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {number}\n     */\n    sbEdgeRestLength(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbEdgeRestLength(this.__wbg_ptr, handle, i);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {number}\n     */\n    sbEdgeStress(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbEdgeStress(this.__wbg_ptr, handle, i);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {number}\n     */\n    sbEdgeTearResistance(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbEdgeTearResistance(this.__wbg_ptr, handle, i);\n        return ret;\n    }\n    /**\n     * The particle pairs of every edge, two indices per edge.\n     * @param {number} handle\n     * @returns {Uint32Array}\n     */\n    sbEdges(handle) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodyset_sbEdges(retptr, this.__wbg_ptr, handle);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayU32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @param {boolean} enabled\n     */\n    sbEnableClusterShapeMatching(handle, i, enabled) {\n        wasm.rawsoftbodyset_sbEnableClusterShapeMatching(this.__wbg_ptr, handle, i, enabled);\n    }\n    /**\n     * @param {number} handle\n     * @param {boolean} enabled\n     */\n    sbEnableVolumePreservation(handle, enabled) {\n        wasm.rawsoftbodyset_sbEnableVolumePreservation(this.__wbg_ptr, handle, enabled);\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    sbGravityScale(handle) {\n        const ret = wasm.rawsoftbodyset_sbGravityScale(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    sbHasPendingTears(handle) {\n        const ret = wasm.rawsoftbodyset_sbHasPendingTears(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {boolean}\n     */\n    sbIsClusterLive(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbIsClusterLive(this.__wbg_ptr, handle, i);\n        return ret !== 0;\n    }\n    /**\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    sbIsEnabled(handle) {\n        const ret = wasm.rawsoftbodyset_sbIsEnabled(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {boolean}\n     */\n    sbIsParticleDamaged(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbIsParticleDamaged(this.__wbg_ptr, handle, i);\n        return ret !== 0;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {boolean}\n     */\n    sbIsParticleOnSurface(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbIsParticleOnSurface(this.__wbg_ptr, handle, i);\n        return ret !== 0;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {boolean}\n     */\n    sbIsParticlePinned(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbIsParticlePinned(this.__wbg_ptr, handle, i);\n        return ret !== 0;\n    }\n    /**\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    sbIsSleeping(handle) {\n        const ret = wasm.rawsoftbodyset_sbIsSleeping(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    sbLinearDamping(handle) {\n        const ret = wasm.rawsoftbodyset_sbLinearDamping(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    sbMass(handle) {\n        const ret = wasm.rawsoftbodyset_sbMass(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @returns {RawSoftBodyMaterial}\n     */\n    sbMaterial(handle) {\n        const ret = wasm.rawsoftbodyset_sbMaterial(this.__wbg_ptr, handle);\n        return RawSoftBodyMaterial.__wrap(ret);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    sbMeshCluster(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbMeshCluster(this.__wbg_ptr, handle, i);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {number | undefined}\n     */\n    sbMeshCollider(handle, i) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodyset_sbMeshCollider(retptr, this.__wbg_ptr, handle, i);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r2 = getDataViewMemory0().getFloat64(retptr + 8 * 1, true);\n            return r0 === 0 ? undefined : r2;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {boolean}\n     */\n    sbMeshCollisionEnabled(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbMeshCollisionEnabled(this.__wbg_ptr, handle, i);\n        return ret !== 0;\n    }\n    /**\n     * The elements of a collision mesh, `DIM` vertex indices per element.\n     * @param {number} handle\n     * @param {number} i\n     * @returns {Uint32Array}\n     */\n    sbMeshIndices(handle, i) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodyset_sbMeshIndices(retptr, this.__wbg_ptr, handle, i);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayU32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {boolean}\n     */\n    sbMeshIsOriented(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbMeshIsOriented(this.__wbg_ptr, handle, i);\n        return ret !== 0;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {boolean}\n     */\n    sbMeshIsSkinned(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbMeshIsSkinned(this.__wbg_ptr, handle, i);\n        return ret !== 0;\n    }\n    /**\n     * The index, in the body's mesh list, of the mesh a deformable collider holds.\n     * @param {number} handle\n     * @param {number} collider\n     * @returns {number | undefined}\n     */\n    sbMeshOfCollider(handle, collider) {\n        const ret = wasm.rawsoftbodyset_sbMeshOfCollider(this.__wbg_ptr, handle, collider);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * The world-space vertex positions of a collision mesh, `DIM` floats per vertex.\n     * @param {number} handle\n     * @param {number} i\n     * @returns {Float32Array}\n     */\n    sbMeshVertices(handle, i) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodyset_sbMeshVertices(retptr, this.__wbg_ptr, handle, i);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayF32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    sbNumAttachments(handle) {\n        const ret = wasm.rawsoftbodyset_sbNumAttachments(this.__wbg_ptr, handle);\n        return ret >>> 0;\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    sbNumCells(handle) {\n        const ret = wasm.rawsoftbodyset_sbNumCells(this.__wbg_ptr, handle);\n        return ret >>> 0;\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    sbNumClusters(handle) {\n        const ret = wasm.rawsoftbodyset_sbNumClusters(this.__wbg_ptr, handle);\n        return ret >>> 0;\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    sbNumDihedrals(handle) {\n        const ret = wasm.rawsoftbodyset_sbNumDihedrals(this.__wbg_ptr, handle);\n        return ret >>> 0;\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    sbNumEdges(handle) {\n        const ret = wasm.rawsoftbodyset_sbNumEdges(this.__wbg_ptr, handle);\n        return ret >>> 0;\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    sbNumMeshes(handle) {\n        const ret = wasm.rawsoftbodyset_sbNumMeshes(this.__wbg_ptr, handle);\n        return ret >>> 0;\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    sbNumParticles(handle) {\n        const ret = wasm.rawsoftbodyset_sbNumParticles(this.__wbg_ptr, handle);\n        return ret >>> 0;\n    }\n    /**\n     * @param {number} handle\n     * @returns {number | undefined}\n     */\n    sbOrigin(handle) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodyset_sbOrigin(retptr, this.__wbg_ptr, handle);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r2 = getDataViewMemory0().getFloat64(retptr + 8 * 1, true);\n            return r0 === 0 ? undefined : r2;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @returns {number}\n     */\n    sbParticleMass(handle, i) {\n        const ret = wasm.rawsoftbodyset_sbParticleMass(this.__wbg_ptr, handle, i);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @param {Float32Array} scratch_buffer\n     */\n    sbParticlePosition(handle, i, scratch_buffer) {\n        try {\n            wasm.rawsoftbodyset_sbParticlePosition(this.__wbg_ptr, handle, i, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} handle\n     * @returns {Float32Array}\n     */\n    sbParticlePositions(handle) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodyset_sbParticlePositions(retptr, this.__wbg_ptr, handle);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayF32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    sbParticleRadius(handle) {\n        const ret = wasm.rawsoftbodyset_sbParticleRadius(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @param {Float32Array} scratch_buffer\n     */\n    sbParticleRestPosition(handle, i, scratch_buffer) {\n        try {\n            wasm.rawsoftbodyset_sbParticleRestPosition(this.__wbg_ptr, handle, i, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} handle\n     * @returns {Float32Array}\n     */\n    sbParticleVelocities(handle) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodyset_sbParticleVelocities(retptr, this.__wbg_ptr, handle);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayF32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @param {Float32Array} scratch_buffer\n     */\n    sbParticleVelocity(handle, i, scratch_buffer) {\n        try {\n            wasm.rawsoftbodyset_sbParticleVelocity(this.__wbg_ptr, handle, i, addBorrowedObject(scratch_buffer));\n        } finally {\n            heap[stack_pointer++] = undefined;\n        }\n    }\n    /**\n     * @param {number} handle\n     * @returns {Float64Array}\n     */\n    sbPieces(handle) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodyset_sbPieces(retptr, this.__wbg_ptr, handle);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayF64FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 8, 8);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} handle\n     * @param {boolean} wake_up\n     */\n    sbResetForces(handle, wake_up) {\n        wasm.rawsoftbodyset_sbResetForces(this.__wbg_ptr, handle, wake_up);\n    }\n    /**\n     * @param {number} handle\n     */\n    sbResetPlasticity(handle) {\n        wasm.rawsoftbodyset_sbResetPlasticity(this.__wbg_ptr, handle);\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    sbRestVolume(handle) {\n        const ret = wasm.rawsoftbodyset_sbRestVolume(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    sbRootBody(handle) {\n        const ret = wasm.rawsoftbodyset_sbRootBody(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} iterations\n     */\n    sbSetAdditionalPgsIterations(handle, iterations) {\n        wasm.rawsoftbodyset_sbSetAdditionalPgsIterations(this.__wbg_ptr, handle, iterations);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @param {number | null} [natural_frequency]\n     * @param {number | null} [damping_ratio]\n     */\n    sbSetClusterEdgeSoftness(handle, i, natural_frequency, damping_ratio) {\n        wasm.rawsoftbodyset_sbSetClusterEdgeSoftness(this.__wbg_ptr, handle, i, isLikeNone(natural_frequency) ? Number.MAX_SAFE_INTEGER : Math.fround(natural_frequency), isLikeNone(damping_ratio) ? Number.MAX_SAFE_INTEGER : Math.fround(damping_ratio));\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @param {RawVector} translation\n     * @param {RawRotation} rotation\n     */\n    sbSetClusterKinematicTarget(handle, i, translation, rotation) {\n        _assertClass(translation, RawVector);\n        _assertClass(rotation, RawRotation);\n        wasm.rawsoftbodyset_sbSetClusterKinematicTarget(this.__wbg_ptr, handle, i, translation.__wbg_ptr, rotation.__wbg_ptr);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @param {boolean} pinned\n     */\n    sbSetClusterPinned(handle, i, pinned) {\n        wasm.rawsoftbodyset_sbSetClusterPinned(this.__wbg_ptr, handle, i, pinned);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @param {number} scale\n     */\n    sbSetClusterStiffnessScale(handle, i, scale) {\n        wasm.rawsoftbodyset_sbSetClusterStiffnessScale(this.__wbg_ptr, handle, i, scale);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @param {number} resistance\n     */\n    sbSetClusterTearResistance(handle, i, resistance) {\n        wasm.rawsoftbodyset_sbSetClusterTearResistance(this.__wbg_ptr, handle, i, resistance);\n    }\n    /**\n     * @param {number} handle\n     * @param {boolean} enabled\n     */\n    sbSetEnabled(handle, enabled) {\n        wasm.rawsoftbodyset_sbSetEnabled(this.__wbg_ptr, handle, enabled);\n    }\n    /**\n     * @param {number} handle\n     * @param {RawSoftBodyMaterial} material\n     */\n    sbSetMaterial(handle, material) {\n        _assertClass(material, RawSoftBodyMaterial);\n        wasm.rawsoftbodyset_sbSetMaterial(this.__wbg_ptr, handle, material.__wbg_ptr);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @param {RawVector} position\n     */\n    sbSetParticleKinematicTarget(handle, i, position) {\n        _assertClass(position, RawVector);\n        wasm.rawsoftbodyset_sbSetParticleKinematicTarget(this.__wbg_ptr, handle, i, position.__wbg_ptr);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @param {boolean} pinned\n     */\n    sbSetParticlePinned(handle, i, pinned) {\n        wasm.rawsoftbodyset_sbSetParticlePinned(this.__wbg_ptr, handle, i, pinned);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @param {RawVector} position\n     */\n    sbSetParticlePosition(handle, i, position) {\n        _assertClass(position, RawVector);\n        wasm.rawsoftbodyset_sbSetParticlePosition(this.__wbg_ptr, handle, i, position.__wbg_ptr);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     * @param {RawVector} velocity\n     */\n    sbSetParticleVelocity(handle, i, velocity) {\n        _assertClass(velocity, RawVector);\n        wasm.rawsoftbodyset_sbSetParticleVelocity(this.__wbg_ptr, handle, i, velocity.__wbg_ptr);\n    }\n    /**\n     * @param {number} handle\n     * @param {RawSoftBodySolver} solver\n     */\n    sbSetSolver(handle, solver) {\n        wasm.rawsoftbodyset_sbSetSolver(this.__wbg_ptr, handle, solver);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} data\n     */\n    sbSetUserData(handle, data) {\n        wasm.rawsoftbodyset_sbSetUserData(this.__wbg_ptr, handle, data);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} factor\n     */\n    sbSetVolumeFactor(handle, factor) {\n        wasm.rawsoftbodyset_sbSetVolumeFactor(this.__wbg_ptr, handle, factor);\n    }\n    /**\n     * @param {number} handle\n     * @returns {RawSoftBodySolver}\n     */\n    sbSolver(handle) {\n        const ret = wasm.rawsoftbodyset_sbSolver(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     */\n    sbTearCell(handle, i) {\n        wasm.rawsoftbodyset_sbTearCell(this.__wbg_ptr, handle, i);\n    }\n    /**\n     * @param {number} handle\n     * @param {number} i\n     */\n    sbTearEdge(handle, i) {\n        wasm.rawsoftbodyset_sbTearEdge(this.__wbg_ptr, handle, i);\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    sbTopologyVersion(handle) {\n        const ret = wasm.rawsoftbodyset_sbTopologyVersion(this.__wbg_ptr, handle);\n        return ret >>> 0;\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    sbUserData(handle) {\n        const ret = wasm.rawsoftbodyset_sbUserData(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    sbVolumeFactor(handle) {\n        const ret = wasm.rawsoftbodyset_sbVolumeFactor(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     * @returns {boolean}\n     */\n    sbVolumePreservationEnabled(handle) {\n        const ret = wasm.rawsoftbodyset_sbVolumePreservationEnabled(this.__wbg_ptr, handle);\n        return ret !== 0;\n    }\n    /**\n     * @param {number} handle\n     * @returns {number}\n     */\n    sbVolume(handle) {\n        const ret = wasm.rawsoftbodyset_sbVolume(this.__wbg_ptr, handle);\n        return ret;\n    }\n    /**\n     * @param {number} handle\n     */\n    sbWakeUp(handle) {\n        wasm.rawsoftbodyset_sbWakeUp(this.__wbg_ptr, handle);\n    }\n    /**\n     * @param {number} handle\n     * @param {Uint32Array} edges\n     * @param {Uint32Array} cells\n     * @param {RawIslandManager} islands\n     * @param {RawRigidBodySet} bodies\n     * @param {RawColliderSet} colliders\n     * @param {RawImpulseJointSet} joints\n     * @param {RawMultibodyJointSet} articulations\n     * @returns {RawSoftBodyTearEvent | undefined}\n     */\n    tear(handle, edges, cells, islands, bodies, colliders, joints, articulations) {\n        const ptr0 = passArray32ToWasm0(edges, wasm.__wbindgen_export3);\n        const len0 = WASM_VECTOR_LEN;\n        const ptr1 = passArray32ToWasm0(cells, wasm.__wbindgen_export3);\n        const len1 = WASM_VECTOR_LEN;\n        _assertClass(islands, RawIslandManager);\n        _assertClass(bodies, RawRigidBodySet);\n        _assertClass(colliders, RawColliderSet);\n        _assertClass(joints, RawImpulseJointSet);\n        _assertClass(articulations, RawMultibodyJointSet);\n        const ret = wasm.rawsoftbodyset_tear(this.__wbg_ptr, handle, ptr0, len0, ptr1, len1, islands.__wbg_ptr, bodies.__wbg_ptr, colliders.__wbg_ptr, joints.__wbg_ptr, articulations.__wbg_ptr);\n        return ret === 0 ? undefined : RawSoftBodyTearEvent.__wrap(ret);\n    }\n    /**\n     * @param {number} handle\n     * @param {RawRigidBodySet} bodies\n     * @param {boolean} strong\n     */\n    wakeUp(handle, bodies, strong) {\n        _assertClass(bodies, RawRigidBodySet);\n        wasm.rawsoftbodyset_wakeUp(this.__wbg_ptr, handle, bodies.__wbg_ptr, strong);\n    }\n}\nif (Symbol.dispose) RawSoftBodySet.prototype[Symbol.dispose] = RawSoftBodySet.prototype.free;\n\n/**\n * Which soft-body solver holds the cells of a body together.\n * @enum {0 | 1}\n */\nexport const RawSoftBodySolver = Object.freeze({\n    Constraints: 0, \"0\": \"Constraints\",\n    Fem: 1, \"1\": \"Fem\",\n});\n\nexport class RawSoftBodyTearEvent {\n    static __wrap(ptr) {\n        const obj = Object.create(RawSoftBodyTearEvent.prototype);\n        obj.__wbg_ptr = ptr;\n        RawSoftBodyTearEventFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawSoftBodyTearEventFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawsoftbodytearevent_free(ptr, 0);\n    }\n    /**\n     * @param {number} i\n     * @returns {number}\n     */\n    clusterSplitCluster(i) {\n        const ret = wasm.rawsoftbodytearevent_clusterSplitCluster(this.__wbg_ptr, i);\n        return ret >>> 0;\n    }\n    /**\n     * @param {number} i\n     * @returns {boolean}\n     */\n    clusterSplitKeepsProxy(i) {\n        const ret = wasm.rawsoftbodytearevent_clusterSplitKeepsProxy(this.__wbg_ptr, i);\n        return ret !== 0;\n    }\n    /**\n     * @param {number} i\n     * @returns {number}\n     */\n    clusterSplitProxy(i) {\n        const ret = wasm.rawsoftbodytearevent_clusterSplitProxy(this.__wbg_ptr, i);\n        return ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number}\n     */\n    clusterSplitSoftBody(i) {\n        const ret = wasm.rawsoftbodytearevent_clusterSplitSoftBody(this.__wbg_ptr, i);\n        return ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number}\n     */\n    clusterSplitSource(i) {\n        const ret = wasm.rawsoftbodytearevent_clusterSplitSource(this.__wbg_ptr, i);\n        return ret >>> 0;\n    }\n    /**\n     * @returns {Uint32Array}\n     */\n    insertedParticles() {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodytearevent_insertedParticles(retptr, this.__wbg_ptr);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayU32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} i\n     * @returns {number}\n     */\n    movedJointFrom(i) {\n        const ret = wasm.rawsoftbodytearevent_movedJointFrom(this.__wbg_ptr, i);\n        return ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number}\n     */\n    movedJointTo(i) {\n        const ret = wasm.rawsoftbodytearevent_movedJointTo(this.__wbg_ptr, i);\n        return ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {number}\n     */\n    movedJoint(i) {\n        const ret = wasm.rawsoftbodytearevent_movedJoint(this.__wbg_ptr, i);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    numClusterSplits() {\n        const ret = wasm.rawsoftbodytearevent_numClusterSplits(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @returns {number}\n     */\n    numMovedJoints() {\n        const ret = wasm.rawsoftbodytearevent_numMovedJoints(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @returns {number}\n     */\n    numPieces() {\n        const ret = wasm.rawsoftbodytearevent_numPieces(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @param {number} particle\n     * @returns {number | undefined}\n     */\n    particleDestinationBody(particle) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodytearevent_particleDestinationBody(retptr, this.__wbg_ptr, particle);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r2 = getDataViewMemory0().getFloat64(retptr + 8 * 1, true);\n            return r0 === 0 ? undefined : r2;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} particle\n     * @returns {number | undefined}\n     */\n    particleDestinationIndex(particle) {\n        const ret = wasm.rawsoftbodytearevent_particleDestinationIndex(this.__wbg_ptr, particle);\n        return ret === Number.MAX_SAFE_INTEGER ? undefined : ret;\n    }\n    /**\n     * @param {number} i\n     * @returns {Uint32Array}\n     */\n    pieceClusters(i) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodytearevent_pieceClusters(retptr, this.__wbg_ptr, i);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayU32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} i\n     * @returns {Uint32Array}\n     */\n    pieceParticles(i) {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodytearevent_pieceParticles(retptr, this.__wbg_ptr, i);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayU32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @param {number} i\n     * @returns {number}\n     */\n    pieceSoftBody(i) {\n        const ret = wasm.rawsoftbodytearevent_pieceSoftBody(this.__wbg_ptr, i);\n        return ret;\n    }\n    /**\n     * @returns {Uint32Array}\n     */\n    removedEdges() {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodytearevent_removedEdges(retptr, this.__wbg_ptr);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayU32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @returns {Uint32Array}\n     */\n    seeds() {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodytearevent_seeds(retptr, this.__wbg_ptr);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayU32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @returns {number}\n     */\n    softBody() {\n        const ret = wasm.rawsoftbodytearevent_softBody(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {Uint32Array}\n     */\n    splitParticles() {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodytearevent_splitParticles(retptr, this.__wbg_ptr);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayU32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @returns {Uint32Array}\n     */\n    tornCells() {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodytearevent_tornCells(retptr, this.__wbg_ptr);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayU32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n    /**\n     * @returns {Uint32Array}\n     */\n    tornEdges() {\n        try {\n            const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n            wasm.rawsoftbodytearevent_tornEdges(retptr, this.__wbg_ptr);\n            var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n            var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n            var v1 = getArrayU32FromWasm0(r0, r1).slice();\n            wasm.__wbindgen_export2(r0, r1 * 4, 4);\n            return v1;\n        } finally {\n            wasm.__wbindgen_add_to_stack_pointer(16);\n        }\n    }\n}\nif (Symbol.dispose) RawSoftBodyTearEvent.prototype[Symbol.dispose] = RawSoftBodyTearEvent.prototype.free;\n\n/**\n * @enum {0 | 1 | 2}\n */\nexport const RawSoftEdgePlasticFlow = Object.freeze({\n    Both: 0, \"0\": \"Both\",\n    Compression: 1, \"1\": \"Compression\",\n    Tension: 2, \"2\": \"Tension\",\n});\n\n/**\n * How a deformable collider's vertices follow the particles of its cluster.\n * @enum {0 | 1 | 2}\n */\nexport const RawSoftMeshBindingMode = Object.freeze({\n    Direct: 0, \"0\": \"Direct\",\n    DirectByPosition: 1, \"1\": \"DirectByPosition\",\n    Skinned: 2, \"2\": \"Skinned\",\n});\n\n/**\n * What the per-point constraints of the features a volume constraint acts on do.\n * @enum {0 | 1 | 2}\n */\nexport const RawSoftPatchConstraints = Object.freeze({\n    Keep: 0, \"0\": \"Keep\",\n    StandDown: 1, \"1\": \"StandDown\",\n    AlongNormal: 2, \"2\": \"AlongNormal\",\n});\n\nexport class RawSoftRecoverySettings {\n    static __wrap(ptr) {\n        const obj = Object.create(RawSoftRecoverySettings.prototype);\n        obj.__wbg_ptr = ptr;\n        RawSoftRecoverySettingsFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawSoftRecoverySettingsFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawsoftrecoverysettings_free(ptr, 0);\n    }\n    /**\n     * @returns {boolean}\n     */\n    get authoredVelocityMargin() {\n        const ret = wasm.rawsoftrecoverysettings_authoredVelocityMargin(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {boolean}\n     */\n    get crossBodyDetection() {\n        const ret = wasm.rawsoftrecoverysettings_crossBodyDetection(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {boolean}\n     */\n    get crossBodyExpelGate() {\n        const ret = wasm.rawsoftrecoverysettings_crossBodyExpelGate(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {boolean}\n     */\n    get crossingRepulsionGuide() {\n        const ret = wasm.rawsoftrecoverysettings_crossingRepulsionGuide(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {boolean}\n     */\n    get crossingRepulsionSelfGuide() {\n        const ret = wasm.rawsoftrecoverysettings_crossingRepulsionSelfGuide(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {boolean}\n     */\n    get crossingRepulsion() {\n        const ret = wasm.rawsoftrecoverysettings_crossingRepulsion(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {boolean}\n     */\n    get detectionMotionGating() {\n        const ret = wasm.rawsoftrecoverysettings_detectionMotionGating(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {boolean}\n     */\n    get edgeSpeculation() {\n        const ret = wasm.rawsoftrecoverysettings_edgeSpeculation(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {boolean}\n     */\n    get edgeStandDown() {\n        const ret = wasm.rawsoftrecoverysettings_edgeStandDown(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {boolean}\n     */\n    get invertedCellDetection() {\n        const ret = wasm.rawsoftrecoverysettings_invertedCellDetection(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    constructor() {\n        const ret = wasm.rawsoftrecoverysettings_new();\n        this.__wbg_ptr = ret;\n        RawSoftRecoverySettingsFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n    /**\n     * @returns {number}\n     */\n    get overlapConstraintPace() {\n        const ret = wasm.rawsoftrecoverysettings_overlapConstraintPace(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {boolean}\n     */\n    get overlapConstraints() {\n        const ret = wasm.rawsoftrecoverysettings_overlapConstraints(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {boolean}\n     */\n    get overlapEdgeStandDown() {\n        const ret = wasm.rawsoftrecoverysettings_overlapEdgeStandDown(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {number}\n     */\n    get overlapKeptDepth() {\n        const ret = wasm.rawsoftrecoverysettings_overlapKeptDepth(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {boolean}\n     */\n    get overlapMultiVolume() {\n        const ret = wasm.rawsoftrecoverysettings_overlapMultiVolume(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {boolean}\n     */\n    get overlapNormalPush() {\n        const ret = wasm.rawsoftrecoverysettings_overlapNormalPush(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {RawSoftPatchConstraints}\n     */\n    get overlapPatchConstraints() {\n        const ret = wasm.rawsoftrecoverysettings_overlapPatchConstraints(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get overlapPatience() {\n        const ret = wasm.rawsoftrecoverysettings_overlapPatience(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @returns {number}\n     */\n    get overlapProgressMargin() {\n        const ret = wasm.rawsoftrecoverysettings_overlapProgressMargin(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {boolean}\n     */\n    get overlapRigid() {\n        const ret = wasm.rawsoftrecoverysettings_overlapRigid(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {boolean}\n     */\n    get overlapSelfRegions() {\n        const ret = wasm.rawsoftrecoverysettings_overlapSelfRegions(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {boolean}\n     */\n    get overlapSkinVolume() {\n        const ret = wasm.rawsoftrecoverysettings_overlapSkinVolume(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {boolean}\n     */\n    get overlapSkipSelfTangled() {\n        const ret = wasm.rawsoftrecoverysettings_overlapSkipSelfTangled(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {number}\n     */\n    get overlapSplit() {\n        const ret = wasm.rawsoftrecoverysettings_overlapSplit(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @returns {number}\n     */\n    get recoveryPace() {\n        const ret = wasm.rawsoftrecoverysettings_recoveryPace(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {boolean}\n     */\n    get selfCrossingDetection() {\n        const ret = wasm.rawsoftrecoverysettings_selfCrossingDetection(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {boolean}\n     */\n    get selfStandDown() {\n        const ret = wasm.rawsoftrecoverysettings_selfStandDown(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @param {boolean} value\n     */\n    set authoredVelocityMargin(value) {\n        wasm.rawsoftrecoverysettings_set_authoredVelocityMargin(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {boolean} value\n     */\n    set crossBodyDetection(value) {\n        wasm.rawsoftrecoverysettings_set_crossBodyDetection(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {boolean} value\n     */\n    set crossBodyExpelGate(value) {\n        wasm.rawsoftrecoverysettings_set_crossBodyExpelGate(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {boolean} value\n     */\n    set crossingRepulsionGuide(value) {\n        wasm.rawsoftrecoverysettings_set_crossingRepulsionGuide(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {boolean} value\n     */\n    set crossingRepulsionSelfGuide(value) {\n        wasm.rawsoftrecoverysettings_set_crossingRepulsionSelfGuide(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {boolean} value\n     */\n    set crossingRepulsion(value) {\n        wasm.rawsoftrecoverysettings_set_crossingRepulsion(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {boolean} value\n     */\n    set detectionMotionGating(value) {\n        wasm.rawsoftrecoverysettings_set_detectionMotionGating(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {boolean} value\n     */\n    set edgeSpeculation(value) {\n        wasm.rawsoftrecoverysettings_set_edgeSpeculation(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {boolean} value\n     */\n    set edgeStandDown(value) {\n        wasm.rawsoftrecoverysettings_set_edgeStandDown(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {boolean} value\n     */\n    set invertedCellDetection(value) {\n        wasm.rawsoftrecoverysettings_set_invertedCellDetection(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set overlapConstraintPace(value) {\n        wasm.rawsoftrecoverysettings_set_overlapConstraintPace(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {boolean} value\n     */\n    set overlapConstraints(value) {\n        wasm.rawsoftrecoverysettings_set_overlapConstraints(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {boolean} value\n     */\n    set overlapEdgeStandDown(value) {\n        wasm.rawsoftrecoverysettings_set_overlapEdgeStandDown(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set overlapKeptDepth(value) {\n        wasm.rawsoftrecoverysettings_set_overlapKeptDepth(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {boolean} value\n     */\n    set overlapMultiVolume(value) {\n        wasm.rawsoftrecoverysettings_set_overlapMultiVolume(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {boolean} value\n     */\n    set overlapNormalPush(value) {\n        wasm.rawsoftrecoverysettings_set_overlapNormalPush(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {RawSoftPatchConstraints} value\n     */\n    set overlapPatchConstraints(value) {\n        wasm.rawsoftrecoverysettings_set_overlapPatchConstraints(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set overlapPatience(value) {\n        wasm.rawsoftrecoverysettings_set_overlapPatience(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set overlapProgressMargin(value) {\n        wasm.rawsoftrecoverysettings_set_overlapProgressMargin(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {boolean} value\n     */\n    set overlapRigid(value) {\n        wasm.rawsoftrecoverysettings_set_overlapRigid(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {boolean} value\n     */\n    set overlapSelfRegions(value) {\n        wasm.rawsoftrecoverysettings_set_overlapSelfRegions(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {boolean} value\n     */\n    set overlapSkinVolume(value) {\n        wasm.rawsoftrecoverysettings_set_overlapSkinVolume(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {boolean} value\n     */\n    set overlapSkipSelfTangled(value) {\n        wasm.rawsoftrecoverysettings_set_overlapSkipSelfTangled(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set overlapSplit(value) {\n        wasm.rawsoftrecoverysettings_set_overlapSplit(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {number} value\n     */\n    set recoveryPace(value) {\n        wasm.rawsoftrecoverysettings_set_recoveryPace(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {boolean} value\n     */\n    set selfCrossingDetection(value) {\n        wasm.rawsoftrecoverysettings_set_selfCrossingDetection(this.__wbg_ptr, value);\n    }\n    /**\n     * @param {boolean} value\n     */\n    set selfStandDown(value) {\n        wasm.rawsoftrecoverysettings_set_selfStandDown(this.__wbg_ptr, value);\n    }\n}\nif (Symbol.dispose) RawSoftRecoverySettings.prototype[Symbol.dispose] = RawSoftRecoverySettings.prototype.free;\n\n/**\n * Parameters for VHACD convex decomposition algorithm\n */\nexport class RawVHACDParameters {\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawVHACDParametersFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawvhacdparameters_free(ptr, 0);\n    }\n    /**\n     * @returns {number}\n     */\n    get alpha() {\n        const ret = wasm.rawvhacdparameters_alpha(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get beta() {\n        const ret = wasm.rawvhacdparameters_beta(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {number}\n     */\n    get concavity() {\n        const ret = wasm.rawvhacdparameters_concavity(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * @returns {boolean}\n     */\n    get convex_hull_approximation() {\n        const ret = wasm.rawvhacdparameters_convex_hull_approximation(this.__wbg_ptr);\n        return ret !== 0;\n    }\n    /**\n     * @returns {number}\n     */\n    get convex_hull_downsampling() {\n        const ret = wasm.rawvhacdparameters_convex_hull_downsampling(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @returns {number}\n     */\n    get max_convex_hulls() {\n        const ret = wasm.rawvhacdparameters_max_convex_hulls(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    constructor() {\n        const ret = wasm.rawvhacdparameters_new();\n        this.__wbg_ptr = ret;\n        RawVHACDParametersFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n    /**\n     * @returns {number}\n     */\n    get plane_downsampling() {\n        const ret = wasm.rawvhacdparameters_plane_downsampling(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @returns {number}\n     */\n    get resolution() {\n        const ret = wasm.rawvhacdparameters_resolution(this.__wbg_ptr);\n        return ret >>> 0;\n    }\n    /**\n     * @param {number} val\n     */\n    set alpha(val) {\n        wasm.rawvhacdparameters_set_alpha(this.__wbg_ptr, val);\n    }\n    /**\n     * @param {number} val\n     */\n    set beta(val) {\n        wasm.rawvhacdparameters_set_beta(this.__wbg_ptr, val);\n    }\n    /**\n     * @param {number} val\n     */\n    set concavity(val) {\n        wasm.rawvhacdparameters_set_concavity(this.__wbg_ptr, val);\n    }\n    /**\n     * @param {boolean} val\n     */\n    set convex_hull_approximation(val) {\n        wasm.rawvhacdparameters_set_convex_hull_approximation(this.__wbg_ptr, val);\n    }\n    /**\n     * @param {number} val\n     */\n    set convex_hull_downsampling(val) {\n        wasm.rawvhacdparameters_set_convex_hull_downsampling(this.__wbg_ptr, val);\n    }\n    /**\n     * @param {number} val\n     */\n    set max_convex_hulls(val) {\n        wasm.rawvhacdparameters_set_max_convex_hulls(this.__wbg_ptr, val);\n    }\n    /**\n     * @param {number} val\n     */\n    set plane_downsampling(val) {\n        wasm.rawvhacdparameters_set_plane_downsampling(this.__wbg_ptr, val);\n    }\n    /**\n     * @param {number} val\n     */\n    set resolution(val) {\n        wasm.rawvhacdparameters_set_resolution(this.__wbg_ptr, val);\n    }\n}\nif (Symbol.dispose) RawVHACDParameters.prototype[Symbol.dispose] = RawVHACDParameters.prototype.free;\n\n/**\n * A vector.\n */\nexport class RawVector {\n    static __wrap(ptr) {\n        const obj = Object.create(RawVector.prototype);\n        obj.__wbg_ptr = ptr;\n        RawVectorFinalization.register(obj, obj.__wbg_ptr, obj);\n        return obj;\n    }\n    __destroy_into_raw() {\n        const ptr = this.__wbg_ptr;\n        this.__wbg_ptr = 0;\n        RawVectorFinalization.unregister(this);\n        return ptr;\n    }\n    free() {\n        const ptr = this.__destroy_into_raw();\n        wasm.__wbg_rawvector_free(ptr, 0);\n    }\n    /**\n     * Creates a new 3D vector from its two components.\n     *\n     * # Parameters\n     * - `x`: the `x` component of this 3D vector.\n     * - `y`: the `y` component of this 3D vector.\n     * - `z`: the `z` component of this 3D vector.\n     * @param {number} x\n     * @param {number} y\n     * @param {number} z\n     */\n    constructor(x, y, z) {\n        const ret = wasm.rawvector_new(x, y, z);\n        this.__wbg_ptr = ret;\n        RawVectorFinalization.register(this, this.__wbg_ptr, this);\n        return this;\n    }\n    /**\n     * Sets the `x` component of this vector.\n     * @param {number} x\n     */\n    set x(x) {\n        wasm.rawvector_set_x(this.__wbg_ptr, x);\n    }\n    /**\n     * Sets the `y` component of this vector.\n     * @param {number} y\n     */\n    set y(y) {\n        wasm.rawvector_set_y(this.__wbg_ptr, y);\n    }\n    /**\n     * Sets the `z` component of this vector.\n     * @param {number} z\n     */\n    set z(z) {\n        wasm.rawvector_set_z(this.__wbg_ptr, z);\n    }\n    /**\n     * The `x` component of this vector.\n     * @returns {number}\n     */\n    get x() {\n        const ret = wasm.rawvector_x(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * Create a new 3D vector from this vector with its components rearranged as `{x, y, z}`.\n     *\n     * This will effectively return a copy of `this`. This method exist for completeness with the\n     * other swizzling functions.\n     * @returns {RawVector}\n     */\n    xyz() {\n        const ret = wasm.rawvector_xyz(this.__wbg_ptr);\n        return RawVector.__wrap(ret);\n    }\n    /**\n     * Create a new 3D vector from this vector with its components rearranged as `{x, z, y}`.\n     * @returns {RawVector}\n     */\n    xzy() {\n        const ret = wasm.rawvector_xzy(this.__wbg_ptr);\n        return RawVector.__wrap(ret);\n    }\n    /**\n     * The `y` component of this vector.\n     * @returns {number}\n     */\n    get y() {\n        const ret = wasm.rawvector_y(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * Create a new 3D vector from this vector with its components rearranged as `{y, x, z}`.\n     * @returns {RawVector}\n     */\n    yxz() {\n        const ret = wasm.rawvector_yxz(this.__wbg_ptr);\n        return RawVector.__wrap(ret);\n    }\n    /**\n     * Create a new 3D vector from this vector with its components rearranged as `{y, z, x}`.\n     * @returns {RawVector}\n     */\n    yzx() {\n        const ret = wasm.rawvector_yzx(this.__wbg_ptr);\n        return RawVector.__wrap(ret);\n    }\n    /**\n     * The `z` component of this vector.\n     * @returns {number}\n     */\n    get z() {\n        const ret = wasm.rawvector_z(this.__wbg_ptr);\n        return ret;\n    }\n    /**\n     * Creates a new vector filled with zeros.\n     * @returns {RawVector}\n     */\n    static zero() {\n        const ret = wasm.rawvector_zero();\n        return RawVector.__wrap(ret);\n    }\n    /**\n     * Create a new 3D vector from this vector with its components rearranged as `{z, x, y}`.\n     * @returns {RawVector}\n     */\n    zxy() {\n        const ret = wasm.rawvector_zxy(this.__wbg_ptr);\n        return RawVector.__wrap(ret);\n    }\n    /**\n     * Create a new 3D vector from this vector with its components rearranged as `{z, y, x}`.\n     * @returns {RawVector}\n     */\n    zyx() {\n        const ret = wasm.rawvector_zyx(this.__wbg_ptr);\n        return RawVector.__wrap(ret);\n    }\n}\nif (Symbol.dispose) RawVector.prototype[Symbol.dispose] = RawVector.prototype.free;\n\n/**\n * @param {number} extra_bytes_count\n */\nexport function reserve_memory(extra_bytes_count) {\n    wasm.reserve_memory(extra_bytes_count);\n}\n\n/**\n * @returns {string}\n */\nexport function version() {\n    let deferred1_0;\n    let deferred1_1;\n    try {\n        const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n        wasm.version(retptr);\n        var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n        var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n        deferred1_0 = r0;\n        deferred1_1 = r1;\n        return getStringFromWasm0(r0, r1);\n    } finally {\n        wasm.__wbindgen_add_to_stack_pointer(16);\n        wasm.__wbindgen_export2(deferred1_0, deferred1_1, 1);\n    }\n}\nfunction __wbg_get_imports() {\n    const import0 = {\n        __proto__: null,\n        __wbg___wbindgen_boolean_get_5b446f51afd21013: function(arg0) {\n            const v = getObject(arg0);\n            const ret = typeof(v) === 'boolean' ? v : undefined;\n            return isLikeNone(ret) ? 0xFFFFFF : ret ? 1 : 0;\n        },\n        __wbg___wbindgen_is_function_1f9d30630b8b1d3d: function(arg0) {\n            const ret = typeof(getObject(arg0)) === 'function';\n            return ret;\n        },\n        __wbg___wbindgen_is_undefined_8865fb403f8fe9d8: function(arg0) {\n            const ret = getObject(arg0) === undefined;\n            return ret;\n        },\n        __wbg___wbindgen_number_get_2e0e7dee9f701a71: function(arg0, arg1) {\n            const obj = getObject(arg1);\n            const ret = typeof(obj) === 'number' ? obj : undefined;\n            getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true);\n            getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);\n        },\n        __wbg___wbindgen_throw_41e9ee4f547fc59a: function(arg0, arg1) {\n            throw new Error(getStringFromWasm0(arg0, arg1));\n        },\n        __wbg_bind_e7f12e49a3040c89: function(arg0, arg1, arg2, arg3) {\n            const ret = getObject(arg0).bind(getObject(arg1), getObject(arg2), getObject(arg3));\n            return addHeapObject(ret);\n        },\n        __wbg_call_1875a20c43a36133: function() { return handleError(function (arg0, arg1, arg2, arg3) {\n            const ret = getObject(arg0).call(getObject(arg1), getObject(arg2), getObject(arg3));\n            return addHeapObject(ret);\n        }, arguments); },\n        __wbg_call_187d372bd5fdd4aa: function() { return handleError(function (arg0, arg1, arg2) {\n            const ret = getObject(arg0).call(getObject(arg1), getObject(arg2));\n            return addHeapObject(ret);\n        }, arguments); },\n        __wbg_call_939a2607c4484b0b: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {\n            const ret = getObject(arg0).call(getObject(arg1), getObject(arg2), getObject(arg3), getObject(arg4));\n            return addHeapObject(ret);\n        }, arguments); },\n        __wbg_length_58572db4c38f3c3e: function(arg0) {\n            const ret = getObject(arg0).length;\n            return ret;\n        },\n        __wbg_length_7f3c00c40364105e: function(arg0) {\n            const ret = getObject(arg0).length;\n            return ret;\n        },\n        __wbg_new_from_slice_9a868026ffa4208a: function(arg0, arg1) {\n            const ret = new Uint8Array(getArrayU8FromWasm0(arg0, arg1));\n            return addHeapObject(ret);\n        },\n        __wbg_new_with_length_cc0362bfe8499e5a: function(arg0) {\n            const ret = new Float32Array(arg0 >>> 0);\n            return addHeapObject(ret);\n        },\n        __wbg_now_e7c6795a7f81e10f: function(arg0) {\n            const ret = getObject(arg0).now();\n            return ret;\n        },\n        __wbg_performance_3fcf6e32a7e1ed0a: function(arg0) {\n            const ret = getObject(arg0).performance;\n            return addHeapObject(ret);\n        },\n        __wbg_prototypesetcall_bc27214492979395: function(arg0, arg1, arg2) {\n            Uint8Array.prototype.set.call(getArrayU8FromWasm0(arg0, arg1), getObject(arg2));\n        },\n        __wbg_rawcontactforceevent_new: function(arg0) {\n            const ret = RawContactForceEvent.__wrap(arg0);\n            return addHeapObject(ret);\n        },\n        __wbg_rawraycolliderintersection_new: function(arg0) {\n            const ret = RawRayColliderIntersection.__wrap(arg0);\n            return addHeapObject(ret);\n        },\n        __wbg_rawshape_unwrap: function(arg0) {\n            const ret = RawShape.__unwrap(getObject(arg0));\n            return ret;\n        },\n        __wbg_rawsoftbodytearevent_new: function(arg0) {\n            const ret = RawSoftBodyTearEvent.__wrap(arg0);\n            return addHeapObject(ret);\n        },\n        __wbg_set_070bd465f1c195a4: function(arg0, arg1, arg2) {\n            getObject(arg0).set(getArrayF32FromWasm0(arg1, arg2));\n        },\n        __wbg_set_index_3a9fd81ba7ece0c0: function(arg0, arg1, arg2) {\n            getObject(arg0)[arg1 >>> 0] = arg2;\n        },\n        __wbg_static_accessor_GLOBAL_266715b9d96ba635: function() {\n            const ret = typeof global === 'undefined' ? null : global;\n            return isLikeNone(ret) ? 0 : addHeapObject(ret);\n        },\n        __wbg_static_accessor_GLOBAL_THIS_10fb7dc1ae063179: function() {\n            const ret = typeof globalThis === 'undefined' ? null : globalThis;\n            return isLikeNone(ret) ? 0 : addHeapObject(ret);\n        },\n        __wbg_static_accessor_SELF_0b583911f537483a: function() {\n            const ret = typeof self === 'undefined' ? null : self;\n            return isLikeNone(ret) ? 0 : addHeapObject(ret);\n        },\n        __wbg_static_accessor_WINDOW_d7f903d1508cbdc4: function() {\n            const ret = typeof window === 'undefined' ? null : window;\n            return isLikeNone(ret) ? 0 : addHeapObject(ret);\n        },\n        __wbindgen_generic_0000000000000001: function(arg0) {\n            // Cast intrinsic for `F64 -> Externref`.\n            const ret = arg0;\n            return addHeapObject(ret);\n        },\n        __wbindgen_object_clone_ref: function(arg0) {\n            const ret = getObject(arg0);\n            return addHeapObject(ret);\n        },\n        __wbindgen_object_drop_ref: function(arg0) {\n            takeObject(arg0);\n        },\n    };\n    return {\n        __proto__: null,\n        \"./rapier_wasm3d_bg.js\": import0,\n    };\n}\n\nconst RawBroadPhaseFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawbroadphase_free(ptr, 1));\nconst RawCCDSolverFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawccdsolver_free(ptr, 1));\nconst RawCharacterCollisionFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawcharactercollision_free(ptr, 1));\nconst RawColliderSetFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawcolliderset_free(ptr, 1));\nconst RawColliderShapeCastHitFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawcollidershapecasthit_free(ptr, 1));\nconst RawContactForceEventFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawcontactforceevent_free(ptr, 1));\nconst RawContactManifoldFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawcontactmanifold_free(ptr, 1));\nconst RawContactPairFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawcontactpair_free(ptr, 1));\nconst RawConvexMeshDataFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawconvexmeshdata_free(ptr, 1));\nconst RawDebugRenderPipelineFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawdebugrenderpipeline_free(ptr, 1));\nconst RawDeserializedWorldFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawdeserializedworld_free(ptr, 1));\nconst RawDynamicRayCastVehicleControllerFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawdynamicraycastvehiclecontroller_free(ptr, 1));\nconst RawEventQueueFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_raweventqueue_free(ptr, 1));\nconst RawGenericJointFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawgenericjoint_free(ptr, 1));\nconst RawImpulseJointSetFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawimpulsejointset_free(ptr, 1));\nconst RawIntegrationParametersFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawintegrationparameters_free(ptr, 1));\nconst RawIslandManagerFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawislandmanager_free(ptr, 1));\nconst RawKinematicCharacterControllerFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawkinematiccharactercontroller_free(ptr, 1));\nconst RawMultibodyJointSetFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawmultibodyjointset_free(ptr, 1));\nconst RawNarrowPhaseFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawnarrowphase_free(ptr, 1));\nconst RawPhysicsPipelineFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawphysicspipeline_free(ptr, 1));\nconst RawPidControllerFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawpidcontroller_free(ptr, 1));\nconst RawPointColliderProjectionFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawpointcolliderprojection_free(ptr, 1));\nconst RawPointProjectionFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawpointprojection_free(ptr, 1));\nconst RawRayColliderHitFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawraycolliderhit_free(ptr, 1));\nconst RawRayColliderIntersectionFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawraycolliderintersection_free(ptr, 1));\nconst RawRayIntersectionFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawrayintersection_free(ptr, 1));\nconst RawRigidBodySetFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawrigidbodyset_free(ptr, 1));\nconst RawRotationFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawrotation_free(ptr, 1));\nconst RawSdpMatrix3Finalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawsdpmatrix3_free(ptr, 1));\nconst RawSerializationPipelineFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawserializationpipeline_free(ptr, 1));\nconst RawShapeFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawshape_free(ptr, 1));\nconst RawShapeCastHitFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawshapecasthit_free(ptr, 1));\nconst RawShapeContactFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawshapecontact_free(ptr, 1));\nconst RawSoftBodyBuilderFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawsoftbodybuilder_free(ptr, 1));\nconst RawSoftBodyMaterialFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawsoftbodymaterial_free(ptr, 1));\nconst RawSoftBodySetFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawsoftbodyset_free(ptr, 1));\nconst RawSoftBodyTearEventFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawsoftbodytearevent_free(ptr, 1));\nconst RawSoftRecoverySettingsFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawsoftrecoverysettings_free(ptr, 1));\nconst RawVHACDParametersFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawvhacdparameters_free(ptr, 1));\nconst RawVectorFinalization = (typeof FinalizationRegistry === 'undefined')\n    ? { register: () => {}, unregister: () => {} }\n    : new FinalizationRegistry(ptr => wasm.__wbg_rawvector_free(ptr, 1));\n\nfunction addHeapObject(obj) {\n    if (heap_next === heap.length) heap.push(heap.length + 1);\n    const idx = heap_next;\n    heap_next = heap[idx];\n\n    heap[idx] = obj;\n    return idx;\n}\n\nfunction _assertClass(instance, klass) {\n    if (!(instance instanceof klass)) {\n        throw new Error(`expected instance of ${klass.name}`);\n    }\n}\n\nfunction addBorrowedObject(obj) {\n    if (stack_pointer == 1) throw new Error('out of js stack');\n    heap[--stack_pointer] = obj;\n    return stack_pointer;\n}\n\nfunction dropObject(idx) {\n    if (idx < 1028) return;\n    heap[idx] = heap_next;\n    heap_next = idx;\n}\n\nfunction getArrayF32FromWasm0(ptr, len) {\n    ptr = ptr >>> 0;\n    return getFloat32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len);\n}\n\nfunction getArrayF64FromWasm0(ptr, len) {\n    ptr = ptr >>> 0;\n    return getFloat64ArrayMemory0().subarray(ptr / 8, ptr / 8 + len);\n}\n\nfunction getArrayI32FromWasm0(ptr, len) {\n    ptr = ptr >>> 0;\n    return getInt32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len);\n}\n\nfunction getArrayU32FromWasm0(ptr, len) {\n    ptr = ptr >>> 0;\n    return getUint32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len);\n}\n\nfunction getArrayU8FromWasm0(ptr, len) {\n    ptr = ptr >>> 0;\n    return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);\n}\n\nlet cachedDataViewMemory0 = null;\nfunction getDataViewMemory0() {\n    if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {\n        cachedDataViewMemory0 = new DataView(wasm.memory.buffer);\n    }\n    return cachedDataViewMemory0;\n}\n\nlet cachedFloat32ArrayMemory0 = null;\nfunction getFloat32ArrayMemory0() {\n    if (cachedFloat32ArrayMemory0 === null || cachedFloat32ArrayMemory0.byteLength === 0) {\n        cachedFloat32ArrayMemory0 = new Float32Array(wasm.memory.buffer);\n    }\n    return cachedFloat32ArrayMemory0;\n}\n\nlet cachedFloat64ArrayMemory0 = null;\nfunction getFloat64ArrayMemory0() {\n    if (cachedFloat64ArrayMemory0 === null || cachedFloat64ArrayMemory0.byteLength === 0) {\n        cachedFloat64ArrayMemory0 = new Float64Array(wasm.memory.buffer);\n    }\n    return cachedFloat64ArrayMemory0;\n}\n\nlet cachedInt32ArrayMemory0 = null;\nfunction getInt32ArrayMemory0() {\n    if (cachedInt32ArrayMemory0 === null || cachedInt32ArrayMemory0.byteLength === 0) {\n        cachedInt32ArrayMemory0 = new Int32Array(wasm.memory.buffer);\n    }\n    return cachedInt32ArrayMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n    return decodeText(ptr >>> 0, len);\n}\n\nlet cachedUint32ArrayMemory0 = null;\nfunction getUint32ArrayMemory0() {\n    if (cachedUint32ArrayMemory0 === null || cachedUint32ArrayMemory0.byteLength === 0) {\n        cachedUint32ArrayMemory0 = new Uint32Array(wasm.memory.buffer);\n    }\n    return cachedUint32ArrayMemory0;\n}\n\nlet cachedUint8ArrayMemory0 = null;\nfunction getUint8ArrayMemory0() {\n    if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n        cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n    }\n    return cachedUint8ArrayMemory0;\n}\n\nfunction getObject(idx) { return heap[idx]; }\n\nfunction handleError(f, args) {\n    try {\n        return f.apply(this, args);\n    } catch (e) {\n        wasm.__wbindgen_export(addHeapObject(e));\n    }\n}\n\nlet heap = new Array(1024).fill(undefined);\nheap.push(undefined, null, true, false);\n\nlet heap_next = heap.length;\n\nfunction isLikeNone(x) {\n    return x === undefined || x === null;\n}\n\nfunction passArray32ToWasm0(arg, malloc) {\n    const ptr = malloc(arg.length * 4, 4) >>> 0;\n    getUint32ArrayMemory0().set(arg, ptr / 4);\n    WASM_VECTOR_LEN = arg.length;\n    return ptr;\n}\n\nfunction passArrayF32ToWasm0(arg, malloc) {\n    const ptr = malloc(arg.length * 4, 4) >>> 0;\n    getFloat32ArrayMemory0().set(arg, ptr / 4);\n    WASM_VECTOR_LEN = arg.length;\n    return ptr;\n}\n\nfunction passArrayJsValueToWasm0(array, malloc) {\n    const ptr = malloc(array.length * 4, 4) >>> 0;\n    const mem = getDataViewMemory0();\n    for (let i = 0; i < array.length; i++) {\n        mem.setUint32(ptr + 4 * i, addHeapObject(array[i]), true);\n    }\n    WASM_VECTOR_LEN = array.length;\n    return ptr;\n}\n\nlet stack_pointer = 1024;\n\nfunction takeObject(idx) {\n    const ret = getObject(idx);\n    dropObject(idx);\n    return ret;\n}\n\nlet cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\ncachedTextDecoder.decode();\nconst MAX_SAFARI_DECODE_BYTES = 2146435072;\nlet numBytesDecoded = 0;\nfunction decodeText(ptr, len) {\n    numBytesDecoded += len;\n    if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {\n        cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n        cachedTextDecoder.decode();\n        numBytesDecoded = len;\n    }\n    return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nlet wasmModule, wasmInstance, wasm;\nfunction __wbg_finalize_init(instance, module) {\n    wasmInstance = instance;\n    wasm = instance.exports;\n    wasmModule = module;\n    cachedDataViewMemory0 = null;\n    cachedFloat32ArrayMemory0 = null;\n    cachedFloat64ArrayMemory0 = null;\n    cachedInt32ArrayMemory0 = null;\n    cachedUint32ArrayMemory0 = null;\n    cachedUint8ArrayMemory0 = null;\n    return wasm;\n}\n\nasync function __wbg_load(module, imports) {\n    if (typeof Response === 'function' && module instanceof Response) {\n        if (!module.ok) {\n            throw new Error(`failed to fetch Wasm: ${module.status} ${module.statusText} fetching '${module.url}'`);\n        }\n\n        if (typeof WebAssembly.instantiateStreaming === 'function') {\n            try {\n                return await WebAssembly.instantiateStreaming(module, imports);\n            } catch (e) {\n                const validResponse = expectedResponseType(module.type);\n\n                if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') {\n                    console.warn(\"`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", e);\n\n                } else { throw e; }\n            }\n        }\n\n        const bytes = await module.arrayBuffer();\n        return await WebAssembly.instantiate(bytes, imports);\n    } else {\n        const instance = await WebAssembly.instantiate(module, imports);\n\n        if (instance instanceof WebAssembly.Instance) {\n            return { instance, module };\n        } else {\n            return instance;\n        }\n    }\n\n    function expectedResponseType(type) {\n        switch (type) {\n            case 'basic': case 'cors': case 'default': return true;\n        }\n        return false;\n    }\n}\n\nfunction initSync(module) {\n    if (wasm !== undefined) return wasm;\n\n\n    if (module !== undefined) {\n        if (Object.getPrototypeOf(module) === Object.prototype) {\n            ({module} = module)\n        } else {\n            console.warn('using deprecated parameters for `initSync()`; pass a single object instead')\n        }\n    }\n\n    const imports = __wbg_get_imports();\n    if (!(module instanceof WebAssembly.Module)) {\n        module = new WebAssembly.Module(module);\n    }\n    const instance = new WebAssembly.Instance(module, imports);\n    return __wbg_finalize_init(instance, module);\n}\n\nasync function __wbg_init(module_or_path) {\n    if (wasm !== undefined) return wasm;\n\n\n    if (module_or_path !== undefined) {\n        if (Object.getPrototypeOf(module_or_path) === Object.prototype) {\n            ({module_or_path} = module_or_path)\n        } else {\n            console.warn('using deprecated parameters for the initialization function; pass a single object instead')\n        }\n    }\n\n    if (module_or_path === undefined) {\n        module_or_path = new URL('rapier_wasm3d_bg.wasm', \"<deleted>\");\n    }\n    const imports = __wbg_get_imports();\n\n    if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {\n        module_or_path = fetch(module_or_path);\n    }\n\n    const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n    return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync, __wbg_init as default };\n","import {RawVector, RawRotation} from \"./raw\";\n// #if DIM3\nimport {RawSdpMatrix3} from \"./raw\";\n// #endif\n\n// scratchBuffer should be as big as the biggest index Rust tries to set on it.\nexport const scratchBuffer = new Float32Array(16);\n\n\n// #if DIM3\nexport interface Vector {\n    x: number;\n    y: number;\n    z: number;\n}\n\n/**\n * A 3D vector.\n */\nexport class Vector3 implements Vector {\n    x: number;\n    y: number;\n    z: number;\n\n    constructor(x: number, y: number, z: number) {\n        this.x = x;\n        this.y = y;\n        this.z = z;\n    }\n}\n\nexport class VectorOps {\n    public static new(x: number, y: number, z: number): Vector {\n        return new Vector3(x, y, z);\n    }\n\n    public static intoRaw(v: Vector): RawVector {\n        return new RawVector(v.x, v.y, v.z);\n    }\n\n    public static zeros(): Vector {\n        return VectorOps.new(0.0, 0.0, 0.0);\n    }\n\n    public static fromBuffer(buffer: Float32Array, target?: Vector): Vector {\n        if (!buffer) return null;\n\n        target ??= VectorOps.zeros();\n        target.x = buffer[0];\n        target.y = buffer[1];\n        target.z = buffer[2];\n        return target;\n    }\n\n    // FIXME: type ram: RawVector?\n    public static fromRaw(raw: RawVector): Vector {\n        if (!raw) return null;\n\n        let res = VectorOps.new(raw.x, raw.y, raw.z);\n        raw.free();\n        return res;\n    }\n\n    public static copy(out: Vector, input: Vector) {\n        out.x = input.x;\n        out.y = input.y;\n        out.z = input.z;\n    }\n}\n\nexport interface Rotation {\n    x: number;\n    y: number;\n    z: number;\n    w: number;\n}\n\n/**\n * A quaternion.\n */\nexport class Quaternion implements Rotation {\n    x: number;\n    y: number;\n    z: number;\n    w: number;\n\n    constructor(x: number, y: number, z: number, w: number) {\n        this.x = x;\n        this.y = y;\n        this.z = z;\n        this.w = w;\n    }\n}\n\nexport class RotationOps {\n    public static identity(): Rotation {\n        return new Quaternion(0.0, 0.0, 0.0, 1.0);\n    }\n\n    public static fromBuffer(\n        buffer: Float32Array,\n        target?: Rotation,\n    ): Rotation {\n        if (!buffer) return null;\n\n        target ??= RotationOps.identity();\n        target.x = buffer[0];\n        target.y = buffer[1];\n        target.z = buffer[2];\n        target.w = buffer[3];\n        return target;\n    }\n\n    public static fromRaw(raw: RawRotation): Rotation {\n        if (!raw) return null;\n\n        let res = new Quaternion(raw.x, raw.y, raw.z, raw.w);\n        raw.free();\n        return res;\n    }\n\n    public static intoRaw(rot: Rotation): RawRotation {\n        return new RawRotation(rot.x, rot.y, rot.z, rot.w);\n    }\n\n    public static copy(out: Rotation, input: Rotation) {\n        out.x = input.x;\n        out.y = input.y;\n        out.z = input.z;\n        out.w = input.w;\n    }\n}\n\n/**\n * A 3D symmetric-positive-definite matrix.\n */\nexport class SdpMatrix3 {\n    /**\n     * Row major list of the upper-triangular part of the symmetric matrix.\n     */\n    elements: Float32Array;\n\n    /**\n     * Matrix element at row 1, column 1.\n     */\n    public get m11(): number {\n        return this.elements[0];\n    }\n\n    /**\n     * Matrix element at row 1, column 2.\n     */\n    public get m12(): number {\n        return this.elements[1];\n    }\n\n    /**\n     * Matrix element at row 2, column 1.\n     */\n    public get m21(): number {\n        return this.m12;\n    }\n\n    /**\n     * Matrix element at row 1, column 3.\n     */\n    public get m13(): number {\n        return this.elements[2];\n    }\n\n    /**\n     * Matrix element at row 3, column 1.\n     */\n    public get m31(): number {\n        return this.m13;\n    }\n\n    /**\n     * Matrix element at row 2, column 2.\n     */\n    public get m22(): number {\n        return this.elements[3];\n    }\n\n    /**\n     * Matrix element at row 2, column 3.\n     */\n    public get m23(): number {\n        return this.elements[4];\n    }\n\n    /**\n     * Matrix element at row 3, column 2.\n     */\n    public get m32(): number {\n        return this.m23;\n    }\n\n    /**\n     * Matrix element at row 3, column 3.\n     */\n    public get m33(): number {\n        return this.elements[5];\n    }\n\n    constructor(elements: Float32Array) {\n        this.elements = elements;\n    }\n}\n\nexport class SdpMatrix3Ops {\n    public static fromBuffer(\n        buffer: Float32Array,\n        target?: SdpMatrix3,\n    ): SdpMatrix3 {\n        if (!buffer) return null;\n\n        target ??= new SdpMatrix3(buffer);\n        target.elements[0] = buffer[0];\n        target.elements[1] = buffer[1];\n        target.elements[2] = buffer[2];\n        target.elements[3] = buffer[3];\n        target.elements[4] = buffer[4];\n        target.elements[5] = buffer[5];\n        return target;\n    }\n\n    public static fromRaw(raw: RawSdpMatrix3): SdpMatrix3 {\n        const sdpMatrix3 = new SdpMatrix3(raw.elements());\n        raw.free();\n        return sdpMatrix3;\n    }\n}\n\n// #endif\n","import {RawRigidBodySet, RawRigidBodyType} from \"../raw\";\nimport {Rotation, RotationOps, Vector, VectorOps, scratchBuffer} from \"../math\";\n// #if DIM3\nimport {SdpMatrix3, SdpMatrix3Ops} from \"../math\";\n// #endif\nimport {Collider, ColliderSet} from \"../geometry\";\n\n/**\n * The integer identifier of a collider added to a `ColliderSet`.\n */\nexport type RigidBodyHandle = number;\n\n/**\n * The simulation status of a rigid-body.\n */\n// TODO: rename this to RigidBodyType\nexport enum RigidBodyType {\n    /**\n     * A `RigidBodyType::Dynamic` body can be affected by all external forces.\n     */\n    Dynamic = 0,\n    /**\n     * A `RigidBodyType::Fixed` body cannot be affected by external forces.\n     */\n    Fixed,\n    /**\n     * A `RigidBodyType::KinematicPositionBased` body cannot be affected by any external forces but can be controlled\n     * by the user at the position level while keeping realistic one-way interaction with dynamic bodies.\n     *\n     * One-way interaction means that a kinematic body can push a dynamic body, but a kinematic body\n     * cannot be pushed by anything. In other words, the trajectory of a kinematic body can only be\n     * modified by the user and is independent from any contact or joint it is involved in.\n     */\n    KinematicPositionBased,\n    /**\n     * A `RigidBodyType::KinematicVelocityBased` body cannot be affected by any external forces but can be controlled\n     * by the user at the velocity level while keeping realistic one-way interaction with dynamic bodies.\n     *\n     * One-way interaction means that a kinematic body can push a dynamic body, but a kinematic body\n     * cannot be pushed by anything. In other words, the trajectory of a kinematic body can only be\n     * modified by the user and is independent from any contact or joint it is involved in.\n     */\n    KinematicVelocityBased,\n    /**\n     * A `RigidBodyType::SoftFrame` body is the proxy of a soft-body cluster: it stands for the\n     * cluster in joints and islands, holds its colliders, and is moved by the cluster's\n     * particles. Its velocity and mass properties come from the cluster.\n     */\n    SoftFrame,\n}\n\n/**\n * A rigid-body.\n */\nexport class RigidBody {\n    private rawSet: RawRigidBodySet; // The RigidBody won't need to free this.\n    private colliderSet: ColliderSet;\n    readonly handle: RigidBodyHandle;\n\n    /**\n     * An arbitrary user-defined object associated with this rigid-body.\n     */\n    public userData?: unknown;\n\n    constructor(\n        rawSet: RawRigidBodySet,\n        colliderSet: ColliderSet,\n        handle: RigidBodyHandle,\n    ) {\n        this.rawSet = rawSet;\n        this.colliderSet = colliderSet;\n        this.handle = handle;\n    }\n\n    /** @internal */\n    public finalizeDeserialization(colliderSet: ColliderSet) {\n        this.colliderSet = colliderSet;\n    }\n\n    /**\n     * Checks if this rigid-body is still valid (i.e. that it has\n     * not been deleted from the rigid-body set yet.\n     */\n    public isValid(): boolean {\n        return this.rawSet.contains(this.handle);\n    }\n\n    /**\n     * Locks or unlocks the ability of this rigid-body to translate.\n     *\n     * @param locked - If `true`, this rigid-body will no longer translate due to forces and impulses.\n     * @param wakeUp - If `true`, this rigid-body will be automatically awaken if it is currently asleep.\n     */\n    public lockTranslations(locked: boolean, wakeUp: boolean) {\n        return this.rawSet.rbLockTranslations(this.handle, locked, wakeUp);\n    }\n\n    /**\n     * Locks or unlocks the ability of this rigid-body to rotate.\n     *\n     * @param locked - If `true`, this rigid-body will no longer rotate due to torques and impulses.\n     * @param wakeUp - If `true`, this rigid-body will be automatically awaken if it is currently asleep.\n     */\n    public lockRotations(locked: boolean, wakeUp: boolean) {\n        return this.rawSet.rbLockRotations(this.handle, locked, wakeUp);\n    }\n\n    // #if DIM3\n    /**\n     * Locks or unlocks the ability of this rigid-body to translate along individual coordinate axes.\n     *\n     * @param enableX - If `false`, this rigid-body will no longer translate due to torques and impulses, along the X coordinate axis.\n     * @param enableY - If `false`, this rigid-body will no longer translate due to torques and impulses, along the Y coordinate axis.\n     * @param enableZ - If `false`, this rigid-body will no longer translate due to torques and impulses, along the Z coordinate axis.\n     * @param wakeUp - If `true`, this rigid-body will be automatically awaken if it is currently asleep.\n     */\n    public setEnabledTranslations(\n        enableX: boolean,\n        enableY: boolean,\n        enableZ: boolean,\n        wakeUp: boolean,\n    ) {\n        return this.rawSet.rbSetEnabledTranslations(\n            this.handle,\n            enableX,\n            enableY,\n            enableZ,\n            wakeUp,\n        );\n    }\n\n    /**\n     * Locks or unlocks the ability of this rigid-body to translate along individual coordinate axes.\n     *\n     * @param enableX - If `false`, this rigid-body will no longer translate due to torques and impulses, along the X coordinate axis.\n     * @param enableY - If `false`, this rigid-body will no longer translate due to torques and impulses, along the Y coordinate axis.\n     * @param enableZ - If `false`, this rigid-body will no longer translate due to torques and impulses, along the Z coordinate axis.\n     * @param wakeUp - If `true`, this rigid-body will be automatically awaken if it is currently asleep.\n     * @deprecated use `this.setEnabledTranslations` with the same arguments instead.\n     */\n    public restrictTranslations(\n        enableX: boolean,\n        enableY: boolean,\n        enableZ: boolean,\n        wakeUp: boolean,\n    ) {\n        this.setEnabledTranslations(enableX, enableY, enableZ, wakeUp);\n    }\n\n    /**\n     * Locks or unlocks the ability of this rigid-body to rotate along individual coordinate axes.\n     *\n     * @param enableX - If `false`, this rigid-body will no longer rotate due to torques and impulses, along the X coordinate axis.\n     * @param enableY - If `false`, this rigid-body will no longer rotate due to torques and impulses, along the Y coordinate axis.\n     * @param enableZ - If `false`, this rigid-body will no longer rotate due to torques and impulses, along the Z coordinate axis.\n     * @param wakeUp - If `true`, this rigid-body will be automatically awaken if it is currently asleep.\n     */\n    public setEnabledRotations(\n        enableX: boolean,\n        enableY: boolean,\n        enableZ: boolean,\n        wakeUp: boolean,\n    ) {\n        return this.rawSet.rbSetEnabledRotations(\n            this.handle,\n            enableX,\n            enableY,\n            enableZ,\n            wakeUp,\n        );\n    }\n\n    /**\n     * Locks or unlocks the ability of this rigid-body to rotate along individual coordinate axes.\n     *\n     * @param enableX - If `false`, this rigid-body will no longer rotate due to torques and impulses, along the X coordinate axis.\n     * @param enableY - If `false`, this rigid-body will no longer rotate due to torques and impulses, along the Y coordinate axis.\n     * @param enableZ - If `false`, this rigid-body will no longer rotate due to torques and impulses, along the Z coordinate axis.\n     * @param wakeUp - If `true`, this rigid-body will be automatically awaken if it is currently asleep.\n     * @deprecated use `this.setEnabledRotations` with the same arguments instead.\n     */\n    public restrictRotations(\n        enableX: boolean,\n        enableY: boolean,\n        enableZ: boolean,\n        wakeUp: boolean,\n    ) {\n        this.setEnabledRotations(enableX, enableY, enableZ, wakeUp);\n    }\n\n    // #endif\n\n    /**\n     * The dominance group, in [-127, +127] this rigid-body is part of.\n     */\n    public dominanceGroup(): number {\n        return this.rawSet.rbDominanceGroup(this.handle);\n    }\n\n    /**\n     * Sets the dominance group of this rigid-body.\n     *\n     * @param group - The dominance group of this rigid-body. Must be a signed integer in the range [-127, +127].\n     */\n    public setDominanceGroup(group: number) {\n        this.rawSet.rbSetDominanceGroup(this.handle, group);\n    }\n\n    /**\n     * The number of additional solver iterations that will be run for this\n     * rigid-body and everything that interacts with it directly or indirectly\n     * through contacts or joints.\n     */\n    public additionalSolverIterations(): number {\n        return this.rawSet.rbAdditionalSolverIterations(this.handle);\n    }\n\n    /**\n     * The additional number of internal PGS iterations run per substep for the island\n     * component containing this rigid-body (default: `0`).\n     */\n    public additionalPgsIterations(): number {\n        return this.rawSet.rbAdditionalPgsIterations(this.handle);\n    }\n\n    /**\n     * Sets the additional number of internal PGS iterations run per substep for the island\n     * component containing this rigid-body; the component runs the largest request.\n     */\n    public setAdditionalPgsIterations(iterations: number) {\n        this.rawSet.rbSetAdditionalPgsIterations(this.handle, iterations);\n    }\n\n    /**\n     * Is this rigid-body the proxy of a soft-body cluster?\n     */\n    public isSoftFrame(): boolean {\n        return this.rawSet.rbIsSoftFrame(this.handle);\n    }\n\n    /**\n     * The handle of the soft body this rigid-body is a cluster proxy of, if any.\n     */\n    public softBody(): number | null {\n        let handle = this.rawSet.rbSoftBody(this.handle);\n        return handle === undefined ? null : handle;\n    }\n\n    /**\n     * The index of the cluster this proxy stands for in its soft body, if any.\n     */\n    public softCluster(): number | null {\n        let cluster = this.rawSet.rbSoftCluster(this.handle);\n        return cluster === undefined ? null : cluster;\n    }\n\n    /**\n     * Sets the number of additional solver iterations that will be run for this\n     * rigid-body and everything that interacts with it directly or indirectly\n     * through contacts or joints.\n     *\n     * Compared to increasing the global `World.numSolverIteration`, setting this\n     * value lets you increase accuracy on only a subset of the scene, resulting in reduced\n     * performance loss.\n     *\n     * @param iters - The new number of additional solver iterations (default: 0).\n     */\n    public setAdditionalSolverIterations(iters: number) {\n        this.rawSet.rbSetAdditionalSolverIterations(this.handle, iters);\n    }\n\n    /**\n     * Enable or disable CCD (Continuous Collision Detection) for this rigid-body.\n     *\n     * @param enabled - If `true`, CCD will be enabled for this rigid-body.\n     */\n    public enableCcd(enabled: boolean) {\n        this.rawSet.rbEnableCcd(this.handle, enabled);\n    }\n\n    /**\n     * Sets the soft-CCD prediction distance for this rigid-body.\n     *\n     * See the documentation of `RigidBodyDesc.setSoftCcdPrediction` for\n     * additional details.\n     */\n    public setSoftCcdPrediction(distance: number) {\n        this.rawSet.rbSetSoftCcdPrediction(this.handle, distance);\n    }\n\n    /**\n     * Gets the soft-CCD prediction distance for this rigid-body.\n     *\n     * See the documentation of `RigidBodyDesc.setSoftCcdPrediction` for\n     * additional details.\n     */\n    public softCcdPrediction(): number {\n        return this.rawSet.rbSoftCcdPrediction(this.handle);\n    }\n\n    /**\n     * The world-space translation of this rigid-body.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public translation(target?: Vector): Vector {\n        this.rawSet.rbTranslation(this.handle, scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n\n    // #if DIM3\n    /**\n     * The world-space orientation of this rigid-body.\n     *\n     * @param {Rotation?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public rotation(target?: Rotation): Rotation {\n        this.rawSet.rbRotation(this.handle, scratchBuffer);\n        return RotationOps.fromBuffer(scratchBuffer, target);\n    }\n    // #endif\n\n    /**\n     * The world-space next translation of this rigid-body.\n     *\n     * If this rigid-body is kinematic this value is set by the `setNextKinematicTranslation`\n     * method and is used for estimating the kinematic body velocity at the next timestep.\n     * For non-kinematic bodies, this value is currently unspecified.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public nextTranslation(target?: Vector): Vector {\n        this.rawSet.rbNextTranslation(this.handle, scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n\n    // #if DIM3\n    /**\n     * The world-space next orientation of this rigid-body.\n     *\n     * If this rigid-body is kinematic this value is set by the `setNextKinematicRotation`\n     * method and is used for estimating the kinematic body velocity at the next timestep.\n     * For non-kinematic bodies, this value is currently unspecified.\n     *\n     * @param {Rotation?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public nextRotation(target?: Rotation): Rotation {\n        this.rawSet.rbNextRotation(this.handle, scratchBuffer);\n        return RotationOps.fromBuffer(scratchBuffer, target);\n    }\n    // #endif\n\n    /**\n     * Sets the translation of this rigid-body.\n     *\n     * @param tra - The world-space position of the rigid-body.\n     * @param wakeUp - Forces the rigid-body to wake-up so it is properly affected by forces if it\n     *                 wasn't moving before modifying its position.\n     */\n    public setTranslation(tra: Vector, wakeUp: boolean) {\n        // #if DIM3\n        this.rawSet.rbSetTranslation(this.handle, tra.x, tra.y, tra.z, wakeUp);\n        // #endif\n    }\n\n    /**\n     * Sets the linear velocity of this rigid-body.\n     *\n     * @param vel - The linear velocity to set.\n     * @param wakeUp - Forces the rigid-body to wake-up if it was asleep.\n     */\n    public setLinvel(vel: Vector, wakeUp: boolean) {\n        let rawVel = VectorOps.intoRaw(vel);\n        this.rawSet.rbSetLinvel(this.handle, rawVel, wakeUp);\n        rawVel.free();\n    }\n\n    /**\n     * The scale factor applied to the gravity affecting\n     * this rigid-body.\n     */\n    public gravityScale(): number {\n        return this.rawSet.rbGravityScale(this.handle);\n    }\n\n    /**\n     * Sets the scale factor applied to the gravity affecting\n     * this rigid-body.\n     *\n     * @param factor - The scale factor to set. A value of 0.0 means\n     *   that this rigid-body will on longer be affected by gravity.\n     * @param wakeUp - Forces the rigid-body to wake-up if it was asleep.\n     */\n    public setGravityScale(factor: number, wakeUp: boolean) {\n        this.rawSet.rbSetGravityScale(this.handle, factor, wakeUp);\n    }\n\n    // #if DIM3\n    /**\n     * Sets the rotation quaternion of this rigid-body.\n     *\n     * This does nothing if a zero quaternion is provided.\n     *\n     * @param rotation - The rotation to set.\n     * @param wakeUp - Forces the rigid-body to wake-up so it is properly affected by forces if it\n     * wasn't moving before modifying its position.\n     */\n    public setRotation(rot: Rotation, wakeUp: boolean) {\n        this.rawSet.rbSetRotation(\n            this.handle,\n            rot.x,\n            rot.y,\n            rot.z,\n            rot.w,\n            wakeUp,\n        );\n    }\n\n    /**\n     * Sets the angular velocity for this rigid-body.\n     *\n     * @param vel - The angular velocity to set.\n     * @param wakeUp - Forces the rigid-body to wake-up if it was asleep.\n     */\n    public setAngvel(vel: Vector, wakeUp: boolean) {\n        let rawVel = VectorOps.intoRaw(vel);\n        this.rawSet.rbSetAngvel(this.handle, rawVel, wakeUp);\n        rawVel.free();\n    }\n\n    // #endif\n\n\n    /**\n     * If this rigid body is kinematic, sets its future translation after the next timestep integration.\n     *\n     * This should be used instead of `rigidBody.setTranslation` to make the dynamic object\n     * interacting with this kinematic body behave as expected. Internally, Rapier will compute\n     * an artificial velocity for this rigid-body from its current position and its next kinematic\n     * position. This velocity will be used to compute forces on dynamic bodies interacting with\n     * this body.\n     *\n     * @param t - The kinematic translation to set.\n     */\n    public setNextKinematicTranslation(t: Vector) {\n        // #if DIM3\n        this.rawSet.rbSetNextKinematicTranslation(this.handle, t.x, t.y, t.z);\n        // #endif\n    }\n\n    // #if DIM3\n    /**\n     * If this rigid body is kinematic, sets its future rotation after the next timestep integration.\n     *\n     * This should be used instead of `rigidBody.setRotation` to make the dynamic object\n     * interacting with this kinematic body behave as expected. Internally, Rapier will compute\n     * an artificial velocity for this rigid-body from its current position and its next kinematic\n     * position. This velocity will be used to compute forces on dynamic bodies interacting with\n     * this body.\n     *\n     * @param rot - The kinematic rotation to set.\n     */\n    public setNextKinematicRotation(rot: Rotation) {\n        this.rawSet.rbSetNextKinematicRotation(\n            this.handle,\n            rot.x,\n            rot.y,\n            rot.z,\n            rot.w,\n        );\n    }\n\n    // #endif\n\n\n    /**\n     * The linear velocity of this rigid-body.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public linvel(target?: Vector): Vector {\n        this.rawSet.rbLinvel(this.handle, scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n    /**\n     * The velocity of the given world-space point on this rigid-body.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public velocityAtPoint(point: Vector, target?: Vector): Vector {\n        const rawPoint = VectorOps.intoRaw(point);\n        this.rawSet.rbVelocityAtPoint(this.handle, rawPoint, scratchBuffer);\n        rawPoint.free();\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n    // #if DIM3\n    /**\n     * The angular velocity of this rigid-body.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public angvel(target?: Vector): Vector {\n        this.rawSet.rbAngvel(this.handle, scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n    // #endif\n\n\n    /**\n     * The mass of this rigid-body.\n     */\n    public mass(): number {\n        return this.rawSet.rbMass(this.handle);\n    }\n\n    /**\n     * The inverse mass taking into account translation locking.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public effectiveInvMass(target?: Vector): Vector {\n        this.rawSet.rbEffectiveInvMass(this.handle, scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n    /**\n     * The inverse of the mass of a rigid-body.\n     *\n     * If this is zero, the rigid-body is assumed to have infinite mass.\n     */\n    public invMass(): number {\n        return this.rawSet.rbInvMass(this.handle);\n    }\n\n    /**\n     * The center of mass of a rigid-body expressed in its local-space.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public localCom(target?: Vector): Vector {\n        this.rawSet.rbLocalCom(this.handle, scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n    /**\n     * The world-space center of mass of the rigid-body.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public worldCom(target?: Vector): Vector {\n        this.rawSet.rbWorldCom(this.handle, scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n\n    // #if DIM3\n    /**\n     * The inverse of the principal angular inertia of the rigid-body.\n     *\n     * Components set to zero are assumed to be infinite along the corresponding principal axis.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public invPrincipalInertia(target?: Vector): Vector {\n        this.rawSet.rbInvPrincipalInertia(this.handle, scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n    // #endif\n\n\n    // #if DIM3\n    /**\n     * The angular inertia along the principal inertia axes of the rigid-body.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public principalInertia(target?: Vector): Vector {\n        this.rawSet.rbPrincipalInertia(this.handle, scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n    // #endif\n\n    // #if DIM3\n    /**\n     * The principal vectors of the local angular inertia tensor of the rigid-body.\n     *\n     * @param {Rotation?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public principalInertiaLocalFrame(target?: Rotation): Rotation {\n        this.rawSet.rbPrincipalInertiaLocalFrame(this.handle, scratchBuffer);\n        return RotationOps.fromBuffer(scratchBuffer, target);\n    }\n    // #endif\n\n\n    // #if DIM3\n    /**\n     * The world-space inverse angular inertia tensor of the rigid-body,\n     * taking into account rotation locking.\n     *\n     * @param {SdpMatrix3?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public effectiveWorldInvInertia(target?: SdpMatrix3): SdpMatrix3 {\n        this.rawSet.rbEffectiveWorldInvInertia(this.handle, scratchBuffer);\n        return SdpMatrix3Ops.fromBuffer(scratchBuffer, target);\n    }\n\n    // #endif\n\n\n    // #if DIM3\n    /**\n     * The effective world-space angular inertia (that takes the potential rotation locking into account) of\n     * this rigid-body.\n     *\n     * @param {SdpMatrix3?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public effectiveAngularInertia(target?: SdpMatrix3): SdpMatrix3 {\n        this.rawSet.rbEffectiveAngularInertia(this.handle, scratchBuffer);\n        return SdpMatrix3Ops.fromBuffer(scratchBuffer, target);\n    }\n\n    // #endif\n\n    /**\n     * Put this rigid body to sleep.\n     *\n     * A sleeping body no longer moves and is no longer simulated by the physics engine unless\n     * it is waken up. It can be woken manually with `this.wakeUp()` or automatically due to\n     * external forces like contacts.\n     */\n    public sleep() {\n        this.rawSet.rbSleep(this.handle);\n    }\n\n    /**\n     * Wakes this rigid-body up.\n     *\n     * A dynamic rigid-body that does not move during several consecutive frames will\n     * be put to sleep by the physics engine, i.e., it will stop being simulated in order\n     * to avoid useless computations.\n     * This methods forces a sleeping rigid-body to wake-up. This is useful, e.g., before modifying\n     * the position of a dynamic body so that it is properly simulated afterwards.\n     */\n    public wakeUp() {\n        this.rawSet.rbWakeUp(this.handle);\n    }\n\n    /**\n     * Is CCD enabled for this rigid-body?\n     */\n    public isCcdEnabled(): boolean {\n        return this.rawSet.rbIsCcdEnabled(this.handle);\n    }\n\n    /**\n     * The number of colliders attached to this rigid-body.\n     */\n    public numColliders(): number {\n        return this.rawSet.rbNumColliders(this.handle);\n    }\n\n    /**\n     * Retrieves the `i-th` collider attached to this rigid-body.\n     *\n     * @param i - The index of the collider to retrieve. Must be a number in `[0, this.numColliders()[`.\n     *         This index is **not** the same as the unique identifier of the collider.\n     */\n    public collider(i: number): Collider {\n        return this.colliderSet.get(this.rawSet.rbCollider(this.handle, i));\n    }\n\n    /**\n     * Sets whether this rigid-body is enabled or not.\n     *\n     * @param enabled - Set to `false` to disable this rigid-body and all its attached colliders.\n     */\n    public setEnabled(enabled: boolean) {\n        this.rawSet.rbSetEnabled(this.handle, enabled);\n    }\n\n    /**\n     * Is this rigid-body enabled?\n     */\n    public isEnabled(): boolean {\n        return this.rawSet.rbIsEnabled(this.handle);\n    }\n\n    /**\n     * The status of this rigid-body: static, dynamic, or kinematic.\n     */\n    public bodyType(): RigidBodyType {\n        return this.rawSet.rbBodyType(this.handle) as number as RigidBodyType;\n    }\n\n    /**\n     * Set a new status for this rigid-body: static, dynamic, or kinematic.\n     */\n    public setBodyType(type: RigidBodyType, wakeUp: boolean) {\n        return this.rawSet.rbSetBodyType(\n            this.handle,\n            type as number as RawRigidBodyType,\n            wakeUp,\n        );\n    }\n\n    /**\n     * Is this rigid-body sleeping?\n     */\n    public isSleeping(): boolean {\n        return this.rawSet.rbIsSleeping(this.handle);\n    }\n\n    /**\n     * Is the velocity of this rigid-body not zero?\n     */\n    public isMoving(): boolean {\n        return this.rawSet.rbIsMoving(this.handle);\n    }\n\n    /**\n     * Is this rigid-body static?\n     */\n    public isFixed(): boolean {\n        return this.rawSet.rbIsFixed(this.handle);\n    }\n\n    /**\n     * Is this rigid-body kinematic?\n     */\n    public isKinematic(): boolean {\n        return this.rawSet.rbIsKinematic(this.handle);\n    }\n\n    /**\n     * Is this rigid-body dynamic?\n     */\n    public isDynamic(): boolean {\n        return this.rawSet.rbIsDynamic(this.handle);\n    }\n\n    /**\n     * The linear damping coefficient of this rigid-body.\n     */\n    public linearDamping(): number {\n        return this.rawSet.rbLinearDamping(this.handle);\n    }\n\n    /**\n     * The angular damping coefficient of this rigid-body.\n     */\n    public angularDamping(): number {\n        return this.rawSet.rbAngularDamping(this.handle);\n    }\n\n    /**\n     * Sets the linear damping factor applied to this rigid-body.\n     *\n     * @param factor - The damping factor to set.\n     */\n    public setLinearDamping(factor: number) {\n        this.rawSet.rbSetLinearDamping(this.handle, factor);\n    }\n\n    /**\n     * Recompute the mass-properties of this rigid-bodies based on its currently attached colliders.\n     */\n    public recomputeMassPropertiesFromColliders() {\n        this.rawSet.rbRecomputeMassPropertiesFromColliders(\n            this.handle,\n            this.colliderSet.raw,\n        );\n    }\n\n    /**\n     * Sets the rigid-body's additional mass.\n     *\n     * The total angular inertia of the rigid-body will be scaled automatically based on this additional mass. If this\n     * scaling effect isn’t desired, use Self::additional_mass_properties instead of this method.\n     *\n     * This is only the \"additional\" mass because the total mass of the rigid-body is equal to the sum of this\n     * additional mass and the mass computed from the colliders (with non-zero densities) attached to this rigid-body.\n     *\n     * That total mass (which includes the attached colliders’ contributions) will be updated at the name physics step,\n     * or can be updated manually with `this.recomputeMassPropertiesFromColliders`.\n     *\n     * This will override any previous additional mass-properties set by `this.setAdditionalMass`,\n     * `this.setAdditionalMassProperties`, `RigidBodyDesc::setAdditionalMass`, or\n     * `RigidBodyDesc.setAdditionalMassfProperties` for this rigid-body.\n     *\n     * @param mass - The additional mass to set.\n     * @param wakeUp - If `true` then the rigid-body will be woken up if it was put to sleep because it did not move for a while.\n     */\n    public setAdditionalMass(mass: number, wakeUp: boolean) {\n        this.rawSet.rbSetAdditionalMass(this.handle, mass, wakeUp);\n    }\n\n    // #if DIM3\n    /**\n     * Sets the rigid-body's additional mass-properties.\n     *\n     * This is only the \"additional\" mass-properties because the total mass-properties of the rigid-body is equal to the\n     * sum of this additional mass-properties and the mass computed from the colliders (with non-zero densities) attached\n     * to this rigid-body.\n     *\n     * That total mass-properties (which include the attached colliders’ contributions) will be updated at the name\n     * physics step, or can be updated manually with `this.recomputeMassPropertiesFromColliders`.\n     *\n     * This will override any previous mass-properties set by `this.setAdditionalMass`,\n     * `this.setAdditionalMassProperties`, `RigidBodyDesc.setAdditionalMass`, or `RigidBodyDesc.setAdditionalMassProperties`\n     * for this rigid-body.\n     *\n     * If `wake_up` is true then the rigid-body will be woken up if it was put to sleep because it did not move for a while.\n     */\n    public setAdditionalMassProperties(\n        mass: number,\n        centerOfMass: Vector,\n        principalAngularInertia: Vector,\n        angularInertiaLocalFrame: Rotation,\n        wakeUp: boolean,\n    ) {\n        let rawCom = VectorOps.intoRaw(centerOfMass);\n        let rawPrincipalInertia = VectorOps.intoRaw(principalAngularInertia);\n        let rawInertiaFrame = RotationOps.intoRaw(angularInertiaLocalFrame);\n\n        this.rawSet.rbSetAdditionalMassProperties(\n            this.handle,\n            mass,\n            rawCom,\n            rawPrincipalInertia,\n            rawInertiaFrame,\n            wakeUp,\n        );\n\n        rawCom.free();\n        rawPrincipalInertia.free();\n        rawInertiaFrame.free();\n    }\n\n    // #endif\n\n\n    /**\n     * Sets the linear damping factor applied to this rigid-body.\n     *\n     * @param factor - The damping factor to set.\n     */\n    public setAngularDamping(factor: number) {\n        this.rawSet.rbSetAngularDamping(this.handle, factor);\n    }\n\n    /**\n     * Resets to zero the user forces (but not torques) applied to this rigid-body.\n     *\n     * @param wakeUp - should the rigid-body be automatically woken-up?\n     */\n    public resetForces(wakeUp: boolean) {\n        this.rawSet.rbResetForces(this.handle, wakeUp);\n    }\n\n    /**\n     * Resets to zero the user torques applied to this rigid-body.\n     *\n     * @param wakeUp - should the rigid-body be automatically woken-up?\n     */\n    public resetTorques(wakeUp: boolean) {\n        this.rawSet.rbResetTorques(this.handle, wakeUp);\n    }\n\n    /**\n     * Adds a force at the center-of-mass of this rigid-body.\n     *\n     * @param force - the world-space force to add to the rigid-body.\n     * @param wakeUp - should the rigid-body be automatically woken-up?\n     */\n    public addForce(force: Vector, wakeUp: boolean) {\n        const rawForce = VectorOps.intoRaw(force);\n        this.rawSet.rbAddForce(this.handle, rawForce, wakeUp);\n        rawForce.free();\n    }\n\n    /**\n     * Applies an impulse at the center-of-mass of this rigid-body.\n     *\n     * @param impulse - the world-space impulse to apply on the rigid-body.\n     * @param wakeUp - should the rigid-body be automatically woken-up?\n     */\n    public applyImpulse(impulse: Vector, wakeUp: boolean) {\n        const rawImpulse = VectorOps.intoRaw(impulse);\n        this.rawSet.rbApplyImpulse(this.handle, rawImpulse, wakeUp);\n        rawImpulse.free();\n    }\n\n\n    // #if DIM3\n    /**\n     * Adds a torque at the center-of-mass of this rigid-body.\n     *\n     * @param torque - the world-space torque to add to the rigid-body.\n     * @param wakeUp - should the rigid-body be automatically woken-up?\n     */\n    public addTorque(torque: Vector, wakeUp: boolean) {\n        const rawTorque = VectorOps.intoRaw(torque);\n        this.rawSet.rbAddTorque(this.handle, rawTorque, wakeUp);\n        rawTorque.free();\n    }\n\n    // #endif\n\n\n    // #if DIM3\n    /**\n     * Applies an impulsive torque at the center-of-mass of this rigid-body.\n     *\n     * @param torqueImpulse - the world-space torque impulse to apply on the rigid-body.\n     * @param wakeUp - should the rigid-body be automatically woken-up?\n     */\n    public applyTorqueImpulse(torqueImpulse: Vector, wakeUp: boolean) {\n        const rawTorqueImpulse = VectorOps.intoRaw(torqueImpulse);\n        this.rawSet.rbApplyTorqueImpulse(this.handle, rawTorqueImpulse, wakeUp);\n        rawTorqueImpulse.free();\n    }\n\n    // #endif\n\n    /**\n     * Adds a force at the given world-space point of this rigid-body.\n     *\n     * @param force - the world-space force to add to the rigid-body.\n     * @param point - the world-space point where the impulse is to be applied on the rigid-body.\n     * @param wakeUp - should the rigid-body be automatically woken-up?\n     */\n    public addForceAtPoint(force: Vector, point: Vector, wakeUp: boolean) {\n        const rawForce = VectorOps.intoRaw(force);\n        const rawPoint = VectorOps.intoRaw(point);\n        this.rawSet.rbAddForceAtPoint(this.handle, rawForce, rawPoint, wakeUp);\n        rawForce.free();\n        rawPoint.free();\n    }\n\n    /**\n     * Applies an impulse at the given world-space point of this rigid-body.\n     *\n     * @param impulse - the world-space impulse to apply on the rigid-body.\n     * @param point - the world-space point where the impulse is to be applied on the rigid-body.\n     * @param wakeUp - should the rigid-body be automatically woken-up?\n     */\n    public applyImpulseAtPoint(\n        impulse: Vector,\n        point: Vector,\n        wakeUp: boolean,\n    ) {\n        const rawImpulse = VectorOps.intoRaw(impulse);\n        const rawPoint = VectorOps.intoRaw(point);\n        this.rawSet.rbApplyImpulseAtPoint(\n            this.handle,\n            rawImpulse,\n            rawPoint,\n            wakeUp,\n        );\n        rawImpulse.free();\n        rawPoint.free();\n    }\n\n    /**\n     * Retrieves the constant force(s) the user added to this rigid-body\n     * Returns zero if the rigid-body is not dynamic.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public userForce(target?: Vector): Vector {\n        this.rawSet.rbUserForce(this.handle, scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n\n    // #if DIM3\n    /**\n     * Retrieves the constant torque(s) the user added to this rigid-body\n     * Returns zero if the rigid-body is not dynamic.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public userTorque(target?: Vector): Vector {\n        this.rawSet.rbUserTorque(this.handle, scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n    // #endif\n}\n\nexport class RigidBodyDesc {\n    enabled: boolean;\n    translation: Vector;\n    rotation: Rotation;\n    gravityScale: number;\n    mass: number;\n    massOnly: boolean;\n    centerOfMass: Vector;\n    translationsEnabledX: boolean;\n    translationsEnabledY: boolean;\n    linvel: Vector;\n    // #if DIM3\n    angvel: Vector;\n    principalAngularInertia: Vector;\n    angularInertiaLocalFrame: Rotation;\n    translationsEnabledZ: boolean;\n    rotationsEnabledX: boolean;\n    rotationsEnabledY: boolean;\n    rotationsEnabledZ: boolean;\n    // #endif\n    linearDamping: number;\n    angularDamping: number;\n    status: RigidBodyType;\n    canSleep: boolean;\n    sleeping: boolean;\n    ccdEnabled: boolean;\n    softCcdPrediction: number;\n    dominanceGroup: number;\n    additionalSolverIterations: number;\n    additionalPgsIterations: number;\n    userData?: unknown;\n\n    constructor(status: RigidBodyType) {\n        this.enabled = true;\n        this.status = status;\n        this.translation = VectorOps.zeros();\n        this.rotation = RotationOps.identity();\n        this.gravityScale = 1.0;\n        this.linvel = VectorOps.zeros();\n        this.mass = 0.0;\n        this.massOnly = false;\n        this.centerOfMass = VectorOps.zeros();\n        this.translationsEnabledX = true;\n        this.translationsEnabledY = true;\n        // #if DIM3\n        this.angvel = VectorOps.zeros();\n        this.principalAngularInertia = VectorOps.zeros();\n        this.angularInertiaLocalFrame = RotationOps.identity();\n        this.translationsEnabledZ = true;\n        this.rotationsEnabledX = true;\n        this.rotationsEnabledY = true;\n        this.rotationsEnabledZ = true;\n        // #endif\n        this.linearDamping = 0.0;\n        this.angularDamping = 0.0;\n        this.canSleep = true;\n        this.sleeping = false;\n        this.ccdEnabled = false;\n        this.softCcdPrediction = 0.0;\n        this.dominanceGroup = 0;\n        this.additionalSolverIterations = 0;\n        this.additionalPgsIterations = 0;\n    }\n\n    /**\n     * A rigid-body descriptor used to build a dynamic rigid-body.\n     */\n    public static dynamic(): RigidBodyDesc {\n        return new RigidBodyDesc(RigidBodyType.Dynamic);\n    }\n\n    /**\n     * A rigid-body descriptor used to build a position-based kinematic rigid-body.\n     */\n    public static kinematicPositionBased(): RigidBodyDesc {\n        return new RigidBodyDesc(RigidBodyType.KinematicPositionBased);\n    }\n\n    /**\n     * A rigid-body descriptor used to build a velocity-based kinematic rigid-body.\n     */\n    public static kinematicVelocityBased(): RigidBodyDesc {\n        return new RigidBodyDesc(RigidBodyType.KinematicVelocityBased);\n    }\n\n    /**\n     * A rigid-body descriptor used to build a fixed rigid-body.\n     */\n    public static fixed(): RigidBodyDesc {\n        return new RigidBodyDesc(RigidBodyType.Fixed);\n    }\n\n    /**\n     * A rigid-body descriptor used to build a dynamic rigid-body.\n     *\n     * @deprecated The method has been renamed to `.dynamic()`.\n     */\n    public static newDynamic(): RigidBodyDesc {\n        return new RigidBodyDesc(RigidBodyType.Dynamic);\n    }\n\n    /**\n     * A rigid-body descriptor used to build a position-based kinematic rigid-body.\n     *\n     * @deprecated The method has been renamed to `.kinematicPositionBased()`.\n     */\n    public static newKinematicPositionBased(): RigidBodyDesc {\n        return new RigidBodyDesc(RigidBodyType.KinematicPositionBased);\n    }\n\n    /**\n     * A rigid-body descriptor used to build a velocity-based kinematic rigid-body.\n     *\n     * @deprecated The method has been renamed to `.kinematicVelocityBased()`.\n     */\n    public static newKinematicVelocityBased(): RigidBodyDesc {\n        return new RigidBodyDesc(RigidBodyType.KinematicVelocityBased);\n    }\n\n    /**\n     * A rigid-body descriptor used to build a fixed rigid-body.\n     *\n     * @deprecated The method has been renamed to `.fixed()`.\n     */\n    public static newStatic(): RigidBodyDesc {\n        return new RigidBodyDesc(RigidBodyType.Fixed);\n    }\n\n    public setDominanceGroup(group: number): RigidBodyDesc {\n        this.dominanceGroup = group;\n        return this;\n    }\n\n    /**\n     * Sets the number of additional solver iterations that will be run for this\n     * rigid-body and everything that interacts with it directly or indirectly\n     * through contacts or joints.\n     *\n     * Compared to increasing the global `World.numSolverIteration`, setting this\n     * value lets you increase accuracy on only a subset of the scene, resulting in reduced\n     * performance loss.\n     *\n     * @param iters - The new number of additional solver iterations (default: 0).\n     */\n    public setAdditionalSolverIterations(iters: number): RigidBodyDesc {\n        this.additionalSolverIterations = iters;\n        return this;\n    }\n\n    /**\n     * Sets the additional number of internal PGS iterations run per substep for the island\n     * component of this rigid-body (default: `0`).\n     *\n     * The component runs the largest request of its bodies; soft bodies ask for three.\n     */\n    public setAdditionalPgsIterations(iters: number): RigidBodyDesc {\n        this.additionalPgsIterations = iters;\n        return this;\n    }\n\n    /**\n     * Sets whether the created rigid-body will be enabled or disabled.\n     * @param enabled − If set to `false` the rigid-body will be disabled at creation.\n     */\n    public setEnabled(enabled: boolean): RigidBodyDesc {\n        this.enabled = enabled;\n        return this;\n    }\n\n\n    // #if DIM3\n    /**\n     * Sets the initial translation of the rigid-body to create.\n     *\n     * @param tra - The translation to set.\n     */\n    public setTranslation(x: number, y: number, z: number): RigidBodyDesc {\n        if (\n            typeof x != \"number\" ||\n            typeof y != \"number\" ||\n            typeof z != \"number\"\n        )\n            throw TypeError(\"The translation components must be numbers.\");\n\n        this.translation = {x: x, y: y, z: z};\n        return this;\n    }\n\n    // #endif\n\n    /**\n     * Sets the initial rotation of the rigid-body to create.\n     *\n     * @param rot - The rotation to set.\n     */\n    public setRotation(rot: Rotation): RigidBodyDesc {\n        // #if DIM3\n        RotationOps.copy(this.rotation, rot);\n        // #endif\n        return this;\n    }\n\n    /**\n     * Sets the scale factor applied to the gravity affecting\n     * the rigid-body being built.\n     *\n     * @param scale - The scale factor. Set this to `0.0` if the rigid-body\n     *   needs to ignore gravity.\n     */\n    public setGravityScale(scale: number): RigidBodyDesc {\n        this.gravityScale = scale;\n        return this;\n    }\n\n    /**\n     * Sets the initial mass of the rigid-body being built, before adding colliders' contributions.\n     *\n     * @param mass − The initial mass of the rigid-body to create.\n     */\n    public setAdditionalMass(mass: number): RigidBodyDesc {\n        this.mass = mass;\n        this.massOnly = true;\n        return this;\n    }\n\n\n    // #if DIM3\n    /**\n     * Sets the initial linear velocity of the rigid-body to create.\n     *\n     * @param x - The linear velocity to set along the `x` axis.\n     * @param y - The linear velocity to set along the `y` axis.\n     * @param z - The linear velocity to set along the `z` axis.\n     */\n    public setLinvel(x: number, y: number, z: number): RigidBodyDesc {\n        if (\n            typeof x != \"number\" ||\n            typeof y != \"number\" ||\n            typeof z != \"number\"\n        )\n            throw TypeError(\"The linvel components must be numbers.\");\n\n        this.linvel = {x: x, y: y, z: z};\n        return this;\n    }\n\n    /**\n     * Sets the initial angular velocity of the rigid-body to create.\n     *\n     * @param vel - The angular velocity to set.\n     */\n    public setAngvel(vel: Vector): RigidBodyDesc {\n        VectorOps.copy(this.angvel, vel);\n        return this;\n    }\n\n    /**\n     * Sets the mass properties of the rigid-body being built.\n     *\n     * Note that the final mass properties of the rigid-bodies depends\n     * on the initial mass-properties of the rigid-body (set by this method)\n     * to which is added the contributions of all the colliders with non-zero density\n     * attached to this rigid-body.\n     *\n     * Therefore, if you want your provided mass properties to be the final\n     * mass properties of your rigid-body, don't attach colliders to it, or\n     * only attach colliders with densities equal to zero.\n     *\n     * @param mass − The initial mass of the rigid-body to create.\n     * @param centerOfMass − The initial center-of-mass of the rigid-body to create.\n     * @param principalAngularInertia − The initial principal angular inertia of the rigid-body to create.\n     *                                  These are the eigenvalues of the angular inertia matrix.\n     * @param angularInertiaLocalFrame − The initial local angular inertia frame of the rigid-body to create.\n     *                                   These are the eigenvectors of the angular inertia matrix.\n     */\n    public setAdditionalMassProperties(\n        mass: number,\n        centerOfMass: Vector,\n        principalAngularInertia: Vector,\n        angularInertiaLocalFrame: Rotation,\n    ): RigidBodyDesc {\n        this.mass = mass;\n        VectorOps.copy(this.centerOfMass, centerOfMass);\n        VectorOps.copy(this.principalAngularInertia, principalAngularInertia);\n        RotationOps.copy(\n            this.angularInertiaLocalFrame,\n            angularInertiaLocalFrame,\n        );\n        this.massOnly = false;\n        return this;\n    }\n\n    /**\n     * Allow translation of this rigid-body only along specific axes.\n     * @param translationsEnabledX - Are translations along the X axis enabled?\n     * @param translationsEnabledY - Are translations along the y axis enabled?\n     * @param translationsEnabledZ - Are translations along the Z axis enabled?\n     */\n    public enabledTranslations(\n        translationsEnabledX: boolean,\n        translationsEnabledY: boolean,\n        translationsEnabledZ: boolean,\n    ): RigidBodyDesc {\n        this.translationsEnabledX = translationsEnabledX;\n        this.translationsEnabledY = translationsEnabledY;\n        this.translationsEnabledZ = translationsEnabledZ;\n        return this;\n    }\n\n    /**\n     * Allow translation of this rigid-body only along specific axes.\n     * @param translationsEnabledX - Are translations along the X axis enabled?\n     * @param translationsEnabledY - Are translations along the y axis enabled?\n     * @param translationsEnabledZ - Are translations along the Z axis enabled?\n     * @deprecated use `this.enabledTranslations` with the same arguments instead.\n     */\n    public restrictTranslations(\n        translationsEnabledX: boolean,\n        translationsEnabledY: boolean,\n        translationsEnabledZ: boolean,\n    ): RigidBodyDesc {\n        return this.enabledTranslations(\n            translationsEnabledX,\n            translationsEnabledY,\n            translationsEnabledZ,\n        );\n    }\n\n    /**\n     * Locks all translations that would have resulted from forces on\n     * the created rigid-body.\n     */\n    public lockTranslations(): RigidBodyDesc {\n        return this.enabledTranslations(false, false, false);\n    }\n\n    /**\n     * Allow rotation of this rigid-body only along specific axes.\n     * @param rotationsEnabledX - Are rotations along the X axis enabled?\n     * @param rotationsEnabledY - Are rotations along the y axis enabled?\n     * @param rotationsEnabledZ - Are rotations along the Z axis enabled?\n     */\n    public enabledRotations(\n        rotationsEnabledX: boolean,\n        rotationsEnabledY: boolean,\n        rotationsEnabledZ: boolean,\n    ): RigidBodyDesc {\n        this.rotationsEnabledX = rotationsEnabledX;\n        this.rotationsEnabledY = rotationsEnabledY;\n        this.rotationsEnabledZ = rotationsEnabledZ;\n        return this;\n    }\n\n    /**\n     * Allow rotation of this rigid-body only along specific axes.\n     * @param rotationsEnabledX - Are rotations along the X axis enabled?\n     * @param rotationsEnabledY - Are rotations along the y axis enabled?\n     * @param rotationsEnabledZ - Are rotations along the Z axis enabled?\n     * @deprecated use `this.enabledRotations` with the same arguments instead.\n     */\n    public restrictRotations(\n        rotationsEnabledX: boolean,\n        rotationsEnabledY: boolean,\n        rotationsEnabledZ: boolean,\n    ): RigidBodyDesc {\n        return this.enabledRotations(\n            rotationsEnabledX,\n            rotationsEnabledY,\n            rotationsEnabledZ,\n        );\n    }\n\n    /**\n     * Locks all rotations that would have resulted from forces on\n     * the created rigid-body.\n     */\n    public lockRotations(): RigidBodyDesc {\n        return this.restrictRotations(false, false, false);\n    }\n\n    // #endif\n\n    /**\n     * Sets the linear damping of the rigid-body to create.\n     *\n     * This will progressively slowdown the translational movement of the rigid-body.\n     *\n     * @param damping - The angular damping coefficient. Should be >= 0. The higher this\n     *                  value is, the stronger the translational slowdown will be.\n     */\n    public setLinearDamping(damping: number): RigidBodyDesc {\n        this.linearDamping = damping;\n        return this;\n    }\n\n    /**\n     * Sets the angular damping of the rigid-body to create.\n     *\n     * This will progressively slowdown the rotational movement of the rigid-body.\n     *\n     * @param damping - The angular damping coefficient. Should be >= 0. The higher this\n     *                  value is, the stronger the rotational slowdown will be.\n     */\n    public setAngularDamping(damping: number): RigidBodyDesc {\n        this.angularDamping = damping;\n        return this;\n    }\n\n    /**\n     * Sets whether or not the rigid-body to create can sleep.\n     *\n     * @param can - true if the rigid-body can sleep, false if it can't.\n     */\n    public setCanSleep(can: boolean): RigidBodyDesc {\n        this.canSleep = can;\n        return this;\n    }\n\n    /**\n     * Sets whether or not the rigid-body is to be created asleep.\n     *\n     * @param can - true if the rigid-body should be in sleep, default false.\n     */\n    setSleeping(sleeping: boolean): RigidBodyDesc {\n        this.sleeping = sleeping;\n        return this;\n    }\n\n    /**\n     * Sets whether Continuous Collision Detection (CCD) is enabled for this rigid-body.\n     *\n     * @param enabled - true if the rigid-body has CCD enabled.\n     */\n    public setCcdEnabled(enabled: boolean): RigidBodyDesc {\n        this.ccdEnabled = enabled;\n        return this;\n    }\n\n    /**\n     * Sets the maximum prediction distance Soft Continuous Collision-Detection.\n     *\n     * When set to 0, soft-CCD is disabled. Soft-CCD helps prevent tunneling especially of\n     * slow-but-thin to moderately fast objects. The soft CCD prediction distance indicates how\n     * far in the object’s path the CCD algorithm is allowed to inspect. Large values can impact\n     * performance badly by increasing the work needed from the broad-phase.\n     *\n     * It is a generally cheaper variant of regular CCD (that can be enabled with\n     * `RigidBodyDesc::setCcdEnabled` since it relies on predictive constraints instead of\n     * shape-cast and substeps.\n     */\n    public setSoftCcdPrediction(distance: number): RigidBodyDesc {\n        this.softCcdPrediction = distance;\n        return this;\n    }\n\n    /**\n     * Sets the user-defined object of this rigid-body.\n     *\n     * @param userData - The user-defined object to set.\n     */\n    public setUserData(data?: unknown): RigidBodyDesc {\n        this.userData = data;\n        return this;\n    }\n}\n","\n// #if DIM3\nexport enum FeatureType {\n    Vertex,\n    Edge,\n    Face,\n    Unknown,\n}\n// #endif\n","import {Vector, VectorOps, Rotation, RotationOps, scratchBuffer} from \"../math\";\nimport {RawColliderSet, RawShape, RawShapeType} from \"../raw\";\nimport {ShapeContact} from \"./contact\";\nimport {PointProjection} from \"./point\";\nimport {Ray, RayIntersection} from \"./ray\";\nimport {ShapeCastHit} from \"./toi\";\nimport {ColliderHandle} from \"./collider\";\n\nexport abstract class Shape {\n    public abstract intoRaw(): RawShape;\n\n    /**\n     * The concrete type of this shape.\n     */\n    public abstract get type(): ShapeType;\n\n    /**\n     * instant mode without cache\n     */\n    public static fromRaw(\n        rawSet: RawColliderSet,\n        handle: ColliderHandle,\n    ): Shape {\n        const rawType = rawSet.coShapeType(handle);\n\n        if (rawType === RawShapeType.Compound) {\n            return Compound.fromRawShape(rawSet.coShape(handle));\n        }\n\n        let borderRadius: number;\n        let vs: Float32Array;\n        let indices: Uint32Array;\n        let halfHeight: number;\n        let radius: number;\n        let normal: Vector;\n\n        switch (rawType) {\n            case RawShapeType.Ball:\n                return new Ball(rawSet.coRadius(handle));\n            case RawShapeType.Cuboid:\n                rawSet.coHalfExtents(handle, scratchBuffer);\n\n\n                // #if DIM3\n                return new Cuboid(\n                    scratchBuffer[0],\n                    scratchBuffer[1],\n                    scratchBuffer[2],\n                );\n            // #endif\n\n            case RawShapeType.RoundCuboid:\n                borderRadius = rawSet.coRoundRadius(handle);\n                rawSet.coHalfExtents(handle, scratchBuffer);\n\n\n                // #if DIM3\n                return new RoundCuboid(\n                    scratchBuffer[0],\n                    scratchBuffer[1],\n                    scratchBuffer[2],\n                    borderRadius,\n                );\n            // #endif\n\n            case RawShapeType.Capsule:\n                halfHeight = rawSet.coHalfHeight(handle);\n                radius = rawSet.coRadius(handle);\n                return new Capsule(halfHeight, radius);\n            case RawShapeType.Segment:\n                vs = rawSet.coVertices(handle);\n\n\n                // #if DIM3\n                return new Segment(\n                    VectorOps.new(vs[0], vs[1], vs[2]),\n                    VectorOps.new(vs[3], vs[4], vs[5]),\n                );\n            // #endif\n\n            case RawShapeType.Polyline:\n                vs = rawSet.coVertices(handle);\n                indices = rawSet.coIndices(handle);\n                return new Polyline(\n                    vs,\n                    indices,\n                    rawSet.coPolylineFlags(handle),\n                );\n            case RawShapeType.Triangle:\n                vs = rawSet.coVertices(handle);\n\n\n                // #if DIM3\n                return new Triangle(\n                    VectorOps.new(vs[0], vs[1], vs[2]),\n                    VectorOps.new(vs[3], vs[4], vs[5]),\n                    VectorOps.new(vs[6], vs[7], vs[8]),\n                );\n            // #endif\n\n            case RawShapeType.RoundTriangle:\n                vs = rawSet.coVertices(handle);\n                borderRadius = rawSet.coRoundRadius(handle);\n\n\n                // #if DIM3\n                return new RoundTriangle(\n                    VectorOps.new(vs[0], vs[1], vs[2]),\n                    VectorOps.new(vs[3], vs[4], vs[5]),\n                    VectorOps.new(vs[6], vs[7], vs[8]),\n                    borderRadius,\n                );\n            // #endif\n\n            case RawShapeType.HalfSpace:\n                rawSet.coHalfspaceNormal(handle, scratchBuffer);\n                normal = VectorOps.fromBuffer(scratchBuffer);\n                return new HalfSpace(normal);\n\n            case RawShapeType.Voxels:\n                const vox_data = rawSet.coVoxelData(handle);\n                const vox_size = rawSet.coVoxelSize(handle);\n                return new Voxels(vox_data, vox_size);\n\n            case RawShapeType.TriMesh:\n                vs = rawSet.coVertices(handle);\n                indices = rawSet.coIndices(handle);\n                const tri_flags = rawSet.coTriMeshFlags(handle);\n                return new TriMesh(vs, indices, tri_flags);\n\n            case RawShapeType.HeightField:\n                const heights = rawSet.coHeightfieldHeights(handle);\n                rawSet.coHeightfieldScale(handle, scratchBuffer);\n\n\n                // #if DIM3\n                const scale = {\n                    x: scratchBuffer[0],\n                    y: scratchBuffer[1],\n                    z: scratchBuffer[2],\n                };\n                const nrows = rawSet.coHeightfieldNRows(handle);\n                const ncols = rawSet.coHeightfieldNCols(handle);\n                const hf_flags = rawSet.coHeightFieldFlags(handle);\n                return new Heightfield(nrows, ncols, heights, scale, hf_flags);\n            // #endif\n\n\n            // #if DIM3\n            case RawShapeType.ConvexPolyhedron:\n                vs = rawSet.coVertices(handle);\n                indices = rawSet.coIndices(handle);\n                return new ConvexPolyhedron(vs, indices);\n            case RawShapeType.RoundConvexPolyhedron:\n                vs = rawSet.coVertices(handle);\n                indices = rawSet.coIndices(handle);\n                borderRadius = rawSet.coRoundRadius(handle);\n                return new RoundConvexPolyhedron(vs, indices, borderRadius);\n            case RawShapeType.Cylinder:\n                halfHeight = rawSet.coHalfHeight(handle);\n                radius = rawSet.coRadius(handle);\n                return new Cylinder(halfHeight, radius);\n            case RawShapeType.RoundCylinder:\n                halfHeight = rawSet.coHalfHeight(handle);\n                radius = rawSet.coRadius(handle);\n                borderRadius = rawSet.coRoundRadius(handle);\n                return new RoundCylinder(halfHeight, radius, borderRadius);\n            case RawShapeType.Cone:\n                halfHeight = rawSet.coHalfHeight(handle);\n                radius = rawSet.coRadius(handle);\n                return new Cone(halfHeight, radius);\n            case RawShapeType.RoundCone:\n                halfHeight = rawSet.coHalfHeight(handle);\n                radius = rawSet.coRadius(handle);\n                borderRadius = rawSet.coRoundRadius(handle);\n                return new RoundCone(halfHeight, radius, borderRadius);\n            // #endif\n\n            default:\n                throw new Error(\"unknown shape type: \" + rawType);\n        }\n    }\n\n    public static fromRawShape(rawShape: RawShape): Shape {\n        if (!rawShape) return null;\n\n        let extents: Vector;\n        let borderRadius: number;\n        let vs: Float32Array;\n        let indices: Uint32Array;\n        let halfHeight: number;\n        let radius: number;\n        let normal: Vector;\n        const rawType = rawShape.shapeType();\n\n        try {\n            switch (rawType) {\n                case RawShapeType.Ball:\n                    return new Ball(rawShape.radius());\n                case RawShapeType.Cuboid:\n                    extents = VectorOps.fromRaw(rawShape.halfExtents());\n\n                    // #if DIM3\n                    return new Cuboid(extents.x, extents.y, extents.z);\n                // #endif\n\n                case RawShapeType.RoundCuboid:\n                    extents = VectorOps.fromRaw(rawShape.halfExtents());\n                    borderRadius = rawShape.roundRadius();\n\n\n                    // #if DIM3\n                    return new RoundCuboid(\n                        extents.x,\n                        extents.y,\n                        extents.z,\n                        borderRadius,\n                    );\n                // #endif\n\n                case RawShapeType.Capsule:\n                    halfHeight = rawShape.halfHeight();\n                    radius = rawShape.radius();\n                    return new Capsule(halfHeight, radius);\n                case RawShapeType.Segment:\n                    vs = rawShape.vertices();\n\n\n                    // #if DIM3\n                    return new Segment(\n                        VectorOps.new(vs[0], vs[1], vs[2]),\n                        VectorOps.new(vs[3], vs[4], vs[5]),\n                    );\n                // #endif\n\n                case RawShapeType.Polyline:\n                    vs = rawShape.vertices();\n                    indices = rawShape.indices();\n                    return new Polyline(vs, indices, rawShape.polylineFlags());\n                case RawShapeType.Triangle:\n                    vs = rawShape.vertices();\n\n\n                    // #if DIM3\n                    return new Triangle(\n                        VectorOps.new(vs[0], vs[1], vs[2]),\n                        VectorOps.new(vs[3], vs[4], vs[5]),\n                        VectorOps.new(vs[6], vs[7], vs[8]),\n                    );\n                // #endif\n\n                case RawShapeType.RoundTriangle:\n                    vs = rawShape.vertices();\n                    borderRadius = rawShape.roundRadius();\n\n\n                    // #if DIM3\n                    return new RoundTriangle(\n                        VectorOps.new(vs[0], vs[1], vs[2]),\n                        VectorOps.new(vs[3], vs[4], vs[5]),\n                        VectorOps.new(vs[6], vs[7], vs[8]),\n                        borderRadius,\n                    );\n                // #endif\n\n                case RawShapeType.HalfSpace:\n                    normal = VectorOps.fromRaw(rawShape.halfspaceNormal());\n                    return new HalfSpace(normal);\n\n                case RawShapeType.Voxels:\n                    const vox_data = rawShape.voxelData();\n                    const vox_size = VectorOps.fromRaw(rawShape.voxelSize());\n                    return new Voxels(vox_data, vox_size);\n\n                case RawShapeType.TriMesh:\n                    vs = rawShape.vertices();\n                    indices = rawShape.indices();\n                    const tri_flags = rawShape.triMeshFlags();\n                    return new TriMesh(vs, indices, tri_flags);\n\n                case RawShapeType.HeightField:\n                    const scale = VectorOps.fromRaw(\n                        rawShape.heightfieldScale(),\n                    );\n                    const heights = rawShape.heightfieldHeights();\n\n\n                    // #if DIM3\n                    const nrows = rawShape.heightfieldNRows();\n                    const ncols = rawShape.heightfieldNCols();\n                    const hf_flags = rawShape.heightFieldFlags();\n                    return new Heightfield(\n                        nrows,\n                        ncols,\n                        heights,\n                        scale,\n                        hf_flags,\n                    );\n                // #endif\n\n\n                // #if DIM3\n                case RawShapeType.ConvexPolyhedron: {\n                    const mesh = rawShape.convexMeshData();\n                    if (!mesh) {\n                        throw new Error(\n                            \"Failed to compute the convex hull of a convex polyhedron shape.\",\n                        );\n                    }\n                    vs = mesh.vertices;\n                    indices = mesh.indices;\n                    mesh.free();\n                    return new ConvexPolyhedron(vs, indices);\n                }\n                case RawShapeType.RoundConvexPolyhedron: {\n                    const mesh = rawShape.convexMeshData();\n                    if (!mesh) {\n                        throw new Error(\n                            \"Failed to compute the convex hull of a convex polyhedron shape.\",\n                        );\n                    }\n                    vs = mesh.vertices;\n                    indices = mesh.indices;\n                    mesh.free();\n                    borderRadius = rawShape.roundRadius();\n                    return new RoundConvexPolyhedron(vs, indices, borderRadius);\n                }\n                case RawShapeType.Cylinder:\n                    halfHeight = rawShape.halfHeight();\n                    radius = rawShape.radius();\n                    return new Cylinder(halfHeight, radius);\n                case RawShapeType.RoundCylinder:\n                    halfHeight = rawShape.halfHeight();\n                    radius = rawShape.radius();\n                    borderRadius = rawShape.roundRadius();\n                    return new RoundCylinder(halfHeight, radius, borderRadius);\n                case RawShapeType.Cone:\n                    halfHeight = rawShape.halfHeight();\n                    radius = rawShape.radius();\n                    return new Cone(halfHeight, radius);\n                case RawShapeType.RoundCone:\n                    halfHeight = rawShape.halfHeight();\n                    radius = rawShape.radius();\n                    borderRadius = rawShape.roundRadius();\n                    return new RoundCone(halfHeight, radius, borderRadius);\n                // #endif\n\n                case RawShapeType.Compound:\n                    return Compound.fromRawShape(rawShape);\n                default:\n                    throw new Error(\"unknown shape type: \" + rawType);\n            }\n        } finally {\n            if (rawType !== RawShapeType.Compound) {\n                rawShape.free();\n            }\n        }\n    }\n\n    /**\n     * Computes the time of impact between two moving shapes.\n     *\n     * In the returned hit, `witness1` and `normal1` lie on this shape and are expressed in its\n     * local-space (relative to `shapePos1` and `shapeRot1`), while `witness2` and `normal2` lie on\n     * `shape2` and are expressed in its local-space (relative to `shapePos2` and `shapeRot2`).\n     *\n     * @param shapePos1 - The initial position of this shape.\n     * @param shapeRot1 - The rotation of this shape.\n     * @param shapeVel1 - The velocity of this shape.\n     * @param shape2 - The second moving shape.\n     * @param shapePos2 - The initial position of the second shape.\n     * @param shapeRot2 - The rotation of the second shape.\n     * @param shapeVel2 - The velocity of the second shape.\n     * @param targetDistance − If the shape moves closer to this distance from a collider, a hit\n     *                         will be returned.\n     * @param maxToi - The maximum time when the impact can happen.\n     * @param stopAtPenetration - If set to `false`, the linear shape-cast won’t immediately stop if\n     *   the shape is penetrating another shape at its starting point **and** its trajectory is such\n     *   that it’s on a path to exit that penetration state.\n     * @param {ShapeCastHit?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     * @returns If the two moving shapes collider at some point along their trajectories, this returns the\n     *  time at which the two shape collider as well as the contact information during the impact. Returns\n     *  `null` if the two shapes never collide along their paths.\n     */\n    public castShape(\n        shapePos1: Vector,\n        shapeRot1: Rotation,\n        shapeVel1: Vector,\n        shape2: Shape,\n        shapePos2: Vector,\n        shapeRot2: Rotation,\n        shapeVel2: Vector,\n        targetDistance: number,\n        maxToi: number,\n        stopAtPenetration: boolean,\n        target?: ShapeCastHit,\n    ): ShapeCastHit | null {\n        let rawPos1 = VectorOps.intoRaw(shapePos1);\n        let rawRot1 = RotationOps.intoRaw(shapeRot1);\n        let rawVel1 = VectorOps.intoRaw(shapeVel1);\n        let rawPos2 = VectorOps.intoRaw(shapePos2);\n        let rawRot2 = RotationOps.intoRaw(shapeRot2);\n        let rawVel2 = VectorOps.intoRaw(shapeVel2);\n\n        let rawShape1 = this.intoRaw();\n        let rawShape2 = shape2.intoRaw();\n\n        const rawShapeCastHit = rawShape1.castShape(\n            rawPos1,\n            rawRot1,\n            rawVel1,\n            rawShape2,\n            rawPos2,\n            rawRot2,\n            rawVel2,\n            targetDistance,\n            maxToi,\n            stopAtPenetration,\n        );\n\n        let result = null;\n        if (rawShapeCastHit) {\n            rawShapeCastHit.getComponents(scratchBuffer);\n            result = ShapeCastHit.fromBuffer(null, scratchBuffer, target);\n            rawShapeCastHit.free();\n        }\n\n        rawPos1.free();\n        rawRot1.free();\n        rawVel1.free();\n        rawPos2.free();\n        rawRot2.free();\n        rawVel2.free();\n\n        rawShape1.free();\n        rawShape2.free();\n\n        return result;\n    }\n\n    /**\n     * Tests if this shape intersects another shape.\n     *\n     * @param shapePos1 - The position of this shape.\n     * @param shapeRot1 - The rotation of this shape.\n     * @param shape2  - The second shape to test.\n     * @param shapePos2 - The position of the second shape.\n     * @param shapeRot2 - The rotation of the second shape.\n     * @returns `true` if the two shapes intersect, `false` if they don’t.\n     */\n    public intersectsShape(\n        shapePos1: Vector,\n        shapeRot1: Rotation,\n        shape2: Shape,\n        shapePos2: Vector,\n        shapeRot2: Rotation,\n    ): boolean {\n        let rawPos1 = VectorOps.intoRaw(shapePos1);\n        let rawRot1 = RotationOps.intoRaw(shapeRot1);\n        let rawPos2 = VectorOps.intoRaw(shapePos2);\n        let rawRot2 = RotationOps.intoRaw(shapeRot2);\n\n        let rawShape1 = this.intoRaw();\n        let rawShape2 = shape2.intoRaw();\n\n        let result = rawShape1.intersectsShape(\n            rawPos1,\n            rawRot1,\n            rawShape2,\n            rawPos2,\n            rawRot2,\n        );\n\n        rawPos1.free();\n        rawRot1.free();\n        rawPos2.free();\n        rawRot2.free();\n\n        rawShape1.free();\n        rawShape2.free();\n\n        return result;\n    }\n\n    /**\n     * Computes one pair of contact points between two shapes.\n     *\n     * @param shapePos1 - The initial position of this sahpe.\n     * @param shapeRot1 - The rotation of this shape.\n     * @param shape2 - The second shape.\n     * @param shapePos2 - The initial position of the second shape.\n     * @param shapeRot2 - The rotation of the second shape.\n     * @param prediction - The prediction value, if the shapes are separated by a distance greater than this value, test will fail.\n     * @returns `null` if the shapes are separated by a distance greater than prediction, otherwise contact details. The result is given in world-space.\n     */\n    contactShape(\n        shapePos1: Vector,\n        shapeRot1: Rotation,\n        shape2: Shape,\n        shapePos2: Vector,\n        shapeRot2: Rotation,\n        prediction: number,\n        target?: ShapeContact,\n    ): ShapeContact | null {\n        let rawPos1 = VectorOps.intoRaw(shapePos1);\n        let rawRot1 = RotationOps.intoRaw(shapeRot1);\n        let rawPos2 = VectorOps.intoRaw(shapePos2);\n        let rawRot2 = RotationOps.intoRaw(shapeRot2);\n\n        let rawShape1 = this.intoRaw();\n        let rawShape2 = shape2.intoRaw();\n\n        let result = ShapeContact.fromBuffer(\n            rawShape1.contactShape(\n                rawPos1,\n                rawRot1,\n                rawShape2,\n                rawPos2,\n                rawRot2,\n                prediction,\n            ),\n            target,\n        );\n\n        rawPos1.free();\n        rawRot1.free();\n        rawPos2.free();\n        rawRot2.free();\n\n        rawShape1.free();\n        rawShape2.free();\n\n        return result;\n    }\n\n    containsPoint(\n        shapePos: Vector,\n        shapeRot: Rotation,\n        point: Vector,\n    ): boolean {\n        let rawPos = VectorOps.intoRaw(shapePos);\n        let rawRot = RotationOps.intoRaw(shapeRot);\n        let rawPoint = VectorOps.intoRaw(point);\n        let rawShape = this.intoRaw();\n\n        let result = rawShape.containsPoint(rawPos, rawRot, rawPoint);\n\n        rawPos.free();\n        rawRot.free();\n        rawPoint.free();\n        rawShape.free();\n\n        return result;\n    }\n\n    projectPoint(\n        shapePos: Vector,\n        shapeRot: Rotation,\n        point: Vector,\n        solid: boolean,\n        target?: PointProjection,\n    ): PointProjection {\n        let rawPos = VectorOps.intoRaw(shapePos);\n        let rawRot = RotationOps.intoRaw(shapeRot);\n        let rawPoint = VectorOps.intoRaw(point);\n        let rawShape = this.intoRaw();\n\n        let result = PointProjection.fromBuffer(\n            rawShape.projectPoint(rawPos, rawRot, rawPoint, solid),\n            target,\n        );\n\n        rawPos.free();\n        rawRot.free();\n        rawPoint.free();\n        rawShape.free();\n\n        return result;\n    }\n\n    intersectsRay(\n        ray: Ray,\n        shapePos: Vector,\n        shapeRot: Rotation,\n        maxToi: number,\n    ): boolean {\n        let rawPos = VectorOps.intoRaw(shapePos);\n        let rawRot = RotationOps.intoRaw(shapeRot);\n        let rawRayOrig = VectorOps.intoRaw(ray.origin);\n        let rawRayDir = VectorOps.intoRaw(ray.dir);\n        let rawShape = this.intoRaw();\n\n        let result = rawShape.intersectsRay(\n            rawPos,\n            rawRot,\n            rawRayOrig,\n            rawRayDir,\n            maxToi,\n        );\n\n        rawPos.free();\n        rawRot.free();\n        rawRayOrig.free();\n        rawRayDir.free();\n        rawShape.free();\n\n        return result;\n    }\n\n    castRay(\n        ray: Ray,\n        shapePos: Vector,\n        shapeRot: Rotation,\n        maxToi: number,\n        solid: boolean,\n    ): number {\n        let rawPos = VectorOps.intoRaw(shapePos);\n        let rawRot = RotationOps.intoRaw(shapeRot);\n        let rawRayOrig = VectorOps.intoRaw(ray.origin);\n        let rawRayDir = VectorOps.intoRaw(ray.dir);\n        let rawShape = this.intoRaw();\n\n        let result = rawShape.castRay(\n            rawPos,\n            rawRot,\n            rawRayOrig,\n            rawRayDir,\n            maxToi,\n            solid,\n        );\n\n        rawPos.free();\n        rawRot.free();\n        rawRayOrig.free();\n        rawRayDir.free();\n        rawShape.free();\n\n        return result;\n    }\n\n    castRayAndGetNormal(\n        ray: Ray,\n        shapePos: Vector,\n        shapeRot: Rotation,\n        maxToi: number,\n        solid: boolean,\n        target?: RayIntersection,\n    ): RayIntersection {\n        let rawPos = VectorOps.intoRaw(shapePos);\n        let rawRot = RotationOps.intoRaw(shapeRot);\n        let rawRayOrig = VectorOps.intoRaw(ray.origin);\n        let rawRayDir = VectorOps.intoRaw(ray.dir);\n        let rawShape = this.intoRaw();\n\n        let result = RayIntersection.fromBuffer(\n            rawShape.castRayAndGetNormal(\n                rawPos,\n                rawRot,\n                rawRayOrig,\n                rawRayDir,\n                maxToi,\n                solid,\n            ),\n            target,\n        );\n\n        rawPos.free();\n        rawRot.free();\n        rawRayOrig.free();\n        rawRayDir.free();\n        rawShape.free();\n\n        return result;\n    }\n}\n\n\n// #if DIM3\n\n/**\n * An enumeration representing the type of a shape.\n */\nexport enum ShapeType {\n    Ball = 0,\n    Cuboid = 1,\n    Capsule = 2,\n    Segment = 3,\n    Polyline = 4,\n    Triangle = 5,\n    TriMesh = 6,\n    HeightField = 7,\n    Compound = 8,\n    ConvexPolyhedron = 9,\n    Cylinder = 10,\n    Cone = 11,\n    RoundCuboid = 12,\n    RoundTriangle = 13,\n    RoundCylinder = 14,\n    RoundCone = 15,\n    RoundConvexPolyhedron = 16,\n    HalfSpace = 17,\n    Voxels = 18,\n}\n\n// NOTE: this **must** match the bits in the HeightFieldFlags on the rust side.\n/**\n * Flags controlling the behavior of some operations involving heightfields.\n */\nexport enum HeightFieldFlags {\n    /**\n     * If set, a special treatment will be applied to contact manifold calculation to eliminate\n     * or fix contacts normals that could lead to incorrect bumps in physics simulation (especially\n     * on flat surfaces).\n     *\n     * This is achieved by taking into account adjacent triangle normals when computing contact\n     * points for a given triangle.\n     */\n    FIX_INTERNAL_EDGES = 0b0000_0001,\n}\n\n// #endif\n\n// NOTE: this **must** match the PolylineFlags on the rust side.\n/**\n * Flags controlling the behavior of a polyline.\n */\nexport enum PolylineFlags {\n    /**\n     * The polyline is deformable: its vertices may be moved after its creation. Required\n     * for a polyline used as a soft body's collision mesh (see\n     * `World.createDeformableCollider`).\n     */\n    DEFORMABLE = 0b0000_0010,\n}\n\n// NOTE: this **must** match the CompoundFlags on the rust side.\n/**\n * Flags controlling the behavior of a compound shape.\n */\nexport enum CompoundFlags {\n    /**\n     * The edges (2D) or faces (3D) where two parts meet are treated as interior to the\n     * union, and contact normals are clamped to the surviving outline. This removes the\n     * ledge a body catches on when it slides across the cut between two parts of a convex\n     * decomposition. Costs a one-off pass over the parts' edges when set.\n     */\n    FIX_INTERNAL_EDGES = 0b0000_0001,\n}\n\n// NOTE: this **must** match the TriMeshFlags on the rust side.\n/**\n * Flags controlling the behavior of the triangle mesh creation and of some\n * operations involving triangle meshes.\n */\nexport enum TriMeshFlags {\n    // NOTE: these two flags are not really useful in JS.\n    //\n    // /**\n    //  * If set, the half-edge topology of the trimesh will be computed if possible.\n    //  */\n    // HALF_EDGE_TOPOLOGY = 0b0000_0001,\n    // /** If set, the half-edge topology and connected components of the trimesh will be computed if possible.\n    //  *\n    //  * Because of the way it is currently implemented, connected components can only be computed on\n    //  * a mesh where the half-edge topology computation succeeds. It will no longer be the case in the\n    //  * future once we decouple the computations.\n    //  */\n    // CONNECTED_COMPONENTS = 0b0000_0010,\n    /**\n     * If set, any triangle that results in a failing half-hedge topology computation will be deleted.\n     */\n    DELETE_BAD_TOPOLOGY_TRIANGLES = 0b0000_0100,\n    /**\n     * If set, the trimesh will be assumed to be oriented (with outward normals).\n     *\n     * The pseudo-normals of its vertices and edges will be computed.\n     */\n    ORIENTED = 0b0000_1000,\n    /**\n     * If set, the duplicate vertices of the trimesh will be merged.\n     *\n     * Two vertices with the exact same coordinates will share the same entry on the\n     * vertex buffer and the index buffer is adjusted accordingly.\n     */\n    MERGE_DUPLICATE_VERTICES = 0b0001_0000,\n    /**\n     * If set, the triangles sharing two vertices with identical index values will be removed.\n     *\n     * Because of the way it is currently implemented, this methods implies that duplicate\n     * vertices will be merged. It will no longer be the case in the future once we decouple\n     * the computations.\n     */\n    DELETE_DEGENERATE_TRIANGLES = 0b0010_0000,\n    /**\n     * If set, two triangles sharing three vertices with identical index values (in any order)\n     * will be removed.\n     *\n     * Because of the way it is currently implemented, this methods implies that duplicate\n     * vertices will be merged. It will no longer be the case in the future once we decouple\n     * the computations.\n     */\n    DELETE_DUPLICATE_TRIANGLES = 0b0100_0000,\n    /**\n     * If set, a special treatment will be applied to contact manifold calculation to eliminate\n     * or fix contacts normals that could lead to incorrect bumps in physics simulation\n     * (especially on flat surfaces).\n     *\n     * This is achieved by taking into account adjacent triangle normals when computing contact\n     * points for a given triangle.\n     *\n     * /!\\ NOT SUPPORTED IN THE 2D VERSION OF RAPIER.\n     */\n    FIX_INTERNAL_EDGES = 0b1000_0000 | TriMeshFlags.MERGE_DUPLICATE_VERTICES,\n    /**\n     * The mesh is deformable: its vertices may be moved after its creation. Required for a\n     * triangle mesh used as a soft body's collision mesh (see\n     * `World.createDeformableCollider`).\n     */\n    DEFORMABLE = 0b1_0000_0000,\n    /**\n     * Like `FIX_INTERNAL_EDGES`, but a contact coming from the back of a triangle is kept and\n     * its normal is constrained by the internal edges too.\n     */\n    FIX_INTERNAL_EDGES_TWO_SIDED = 0b10_0000_0000 |\n        TriMeshFlags.FIX_INTERNAL_EDGES,\n}\n\n/**\n * A shape that is a sphere in 3D and a circle in 2D.\n */\nexport class Ball extends Shape {\n    readonly type = ShapeType.Ball;\n\n    /**\n     * The balls radius.\n     */\n    radius: number;\n\n    /**\n     * Creates a new ball with the given radius.\n     * @param radius - The balls radius.\n     */\n    constructor(radius: number) {\n        super();\n        this.radius = radius;\n    }\n\n    public intoRaw(): RawShape {\n        return RawShape.ball(this.radius);\n    }\n}\n\nexport class HalfSpace extends Shape {\n    readonly type = ShapeType.HalfSpace;\n\n    /**\n     * The outward normal of the half-space.\n     */\n    normal: Vector;\n\n    /**\n     * Creates a new halfspace delimited by an infinite plane.\n     *\n     * @param normal - The outward normal of the plane.\n     */\n    constructor(normal: Vector) {\n        super();\n        this.normal = normal;\n    }\n\n    public intoRaw(): RawShape {\n        let n = VectorOps.intoRaw(this.normal);\n        let result = RawShape.halfspace(n);\n        n.free();\n        return result;\n    }\n}\n\n/**\n * A shape that is a box in 3D and a rectangle in 2D.\n */\nexport class Cuboid extends Shape {\n    readonly type = ShapeType.Cuboid;\n\n    /**\n     * The half extent of the cuboid along each coordinate axis.\n     */\n    halfExtents: Vector;\n\n\n    // #if DIM3\n    /**\n     * Creates a new 3D cuboid.\n     * @param hx - The half width of the cuboid.\n     * @param hy - The half height of the cuboid.\n     * @param hz - The half depth of the cuboid.\n     */\n    constructor(hx: number, hy: number, hz: number) {\n        super();\n        this.halfExtents = VectorOps.new(hx, hy, hz);\n    }\n\n    // #endif\n\n    public intoRaw(): RawShape {\n\n        // #if DIM3\n        return RawShape.cuboid(\n            this.halfExtents.x,\n            this.halfExtents.y,\n            this.halfExtents.z,\n        );\n        // #endif\n    }\n}\n\n/**\n * A shape that is a box in 3D and a rectangle in 2D, with round corners.\n */\nexport class RoundCuboid extends Shape {\n    readonly type = ShapeType.RoundCuboid;\n\n    /**\n     * The half extent of the cuboid along each coordinate axis.\n     */\n    halfExtents: Vector;\n\n    /**\n     * The radius of the cuboid's round border.\n     */\n    borderRadius: number;\n\n\n    // #if DIM3\n    /**\n     * Creates a new 3D cuboid.\n     * @param hx - The half width of the cuboid.\n     * @param hy - The half height of the cuboid.\n     * @param hz - The half depth of the cuboid.\n     * @param borderRadius - The radius of the borders of this cuboid. This will\n     *   effectively increase the half-extents of the cuboid by this radius.\n     */\n    constructor(hx: number, hy: number, hz: number, borderRadius: number) {\n        super();\n        this.halfExtents = VectorOps.new(hx, hy, hz);\n        this.borderRadius = borderRadius;\n    }\n\n    // #endif\n\n    public intoRaw(): RawShape {\n\n        // #if DIM3\n        return RawShape.roundCuboid(\n            this.halfExtents.x,\n            this.halfExtents.y,\n            this.halfExtents.z,\n            this.borderRadius,\n        );\n        // #endif\n    }\n}\n\n/**\n * A shape that is a capsule.\n */\nexport class Capsule extends Shape {\n    readonly type = ShapeType.Capsule;\n\n    /**\n     * The radius of the capsule's basis.\n     */\n    radius: number;\n\n    /**\n     * The capsule's half height, along the `y` axis.\n     */\n    halfHeight: number;\n\n    /**\n     * Creates a new capsule with the given radius and half-height.\n     * @param halfHeight - The balls half-height along the `y` axis.\n     * @param radius - The balls radius.\n     */\n    constructor(halfHeight: number, radius: number) {\n        super();\n        this.halfHeight = halfHeight;\n        this.radius = radius;\n    }\n\n    public intoRaw(): RawShape {\n        return RawShape.capsule(this.halfHeight, this.radius);\n    }\n}\n\n/**\n * A shape that is a segment.\n */\nexport class Segment extends Shape {\n    readonly type = ShapeType.Segment;\n\n    /**\n     * The first point of the segment.\n     */\n    a: Vector;\n\n    /**\n     * The second point of the segment.\n     */\n    b: Vector;\n\n    /**\n     * Creates a new segment shape.\n     * @param a - The first point of the segment.\n     * @param b - The second point of the segment.\n     */\n    constructor(a: Vector, b: Vector) {\n        super();\n        this.a = a;\n        this.b = b;\n    }\n\n    public intoRaw(): RawShape {\n        let ra = VectorOps.intoRaw(this.a);\n        let rb = VectorOps.intoRaw(this.b);\n        let result = RawShape.segment(ra, rb);\n        ra.free();\n        rb.free();\n        return result;\n    }\n}\n\n/**\n * A shape that is a segment.\n */\nexport class Triangle extends Shape {\n    readonly type = ShapeType.Triangle;\n\n    /**\n     * The first point of the triangle.\n     */\n    a: Vector;\n\n    /**\n     * The second point of the triangle.\n     */\n    b: Vector;\n\n    /**\n     * The second point of the triangle.\n     */\n    c: Vector;\n\n    /**\n     * Creates a new triangle shape.\n     *\n     * @param a - The first point of the triangle.\n     * @param b - The second point of the triangle.\n     * @param c - The third point of the triangle.\n     */\n    constructor(a: Vector, b: Vector, c: Vector) {\n        super();\n        this.a = a;\n        this.b = b;\n        this.c = c;\n    }\n\n    public intoRaw(): RawShape {\n        let ra = VectorOps.intoRaw(this.a);\n        let rb = VectorOps.intoRaw(this.b);\n        let rc = VectorOps.intoRaw(this.c);\n        let result = RawShape.triangle(ra, rb, rc);\n        ra.free();\n        rb.free();\n        rc.free();\n        return result;\n    }\n}\n\n/**\n * A shape that is a triangle with round borders and a non-zero thickness.\n */\nexport class RoundTriangle extends Shape {\n    readonly type = ShapeType.RoundTriangle;\n\n    /**\n     * The first point of the triangle.\n     */\n    a: Vector;\n\n    /**\n     * The second point of the triangle.\n     */\n    b: Vector;\n\n    /**\n     * The second point of the triangle.\n     */\n    c: Vector;\n\n    /**\n     * The radius of the triangles's rounded edges and vertices.\n     * In 3D, this is also equal to half the thickness of the round triangle.\n     */\n    borderRadius: number;\n\n    /**\n     * Creates a new triangle shape with round corners.\n     *\n     * @param a - The first point of the triangle.\n     * @param b - The second point of the triangle.\n     * @param c - The third point of the triangle.\n     * @param borderRadius - The radius of the borders of this triangle. In 3D,\n     *   this is also equal to half the thickness of the triangle.\n     */\n    constructor(a: Vector, b: Vector, c: Vector, borderRadius: number) {\n        super();\n        this.a = a;\n        this.b = b;\n        this.c = c;\n        this.borderRadius = borderRadius;\n    }\n\n    public intoRaw(): RawShape {\n        let ra = VectorOps.intoRaw(this.a);\n        let rb = VectorOps.intoRaw(this.b);\n        let rc = VectorOps.intoRaw(this.c);\n        let result = RawShape.roundTriangle(ra, rb, rc, this.borderRadius);\n        ra.free();\n        rb.free();\n        rc.free();\n        return result;\n    }\n}\n\n/**\n * A shape that is a triangle mesh.\n */\nexport class Polyline extends Shape {\n    readonly type = ShapeType.Polyline;\n\n    /**\n     * The vertices of the polyline.\n     */\n    vertices: Float32Array;\n\n    /**\n     * The indices of the segments.\n     */\n    indices: Uint32Array;\n\n    /**\n     * The polyline flags.\n     */\n    flags: PolylineFlags;\n\n    /**\n     * Creates a new polyline shape.\n     *\n     * @param vertices - The coordinates of the polyline's vertices.\n     * @param indices - The indices of the polyline's segments. If this is `null` or not provided, then\n     *    the vertices are assumed to form a line strip.\n     * @param flags - The polyline flags.\n     */\n    constructor(\n        vertices: Float32Array,\n        indices?: Uint32Array,\n        flags?: PolylineFlags,\n    ) {\n        super();\n        this.vertices = vertices;\n        this.indices = indices ?? new Uint32Array(0);\n        this.flags = flags ?? (0 as PolylineFlags);\n    }\n\n    public intoRaw(): RawShape {\n        return RawShape.polyline(this.vertices, this.indices, this.flags);\n    }\n}\n\n/**\n * A shape made of voxels.\n */\nexport class Voxels extends Shape {\n    readonly type = ShapeType.Voxels;\n\n    /**\n     * The points or grid coordinates used to initialize the voxels.\n     */\n    data: Float32Array | Int32Array;\n\n    /**\n     * The dimensions of each voxel.\n     */\n    voxelSize: Vector;\n\n    /**\n     * Creates a new shape made of voxels.\n     *\n     * @param data - Defines the set of voxels. If this is a `Int32Array` then\n     *               each voxel is defined from its (signed) grid coordinates,\n     *               with 3 (resp 2) contiguous integers per voxel in 3D (resp 2D).\n     *               If this is a `Float32Array`, each voxel will be such that\n     *               they contain at least one point from this array (where each\n     *               point is defined from 3 (resp 2) contiguous numbers per point\n     *               in 3D (resp 2D).\n     * @param voxelSize - The size of each voxel.\n     */\n    constructor(data: Float32Array | Int32Array, voxelSize: Vector) {\n        super();\n        this.data = data;\n        this.voxelSize = voxelSize;\n    }\n\n    public intoRaw(): RawShape {\n        let voxelSize = VectorOps.intoRaw(this.voxelSize);\n\n        let result;\n        if (this.data instanceof Int32Array) {\n            result = RawShape.voxels(voxelSize, this.data);\n        } else {\n            result = RawShape.voxelsFromPoints(voxelSize, this.data);\n        }\n\n        voxelSize.free();\n        return result;\n    }\n}\n\n/**\n * A compound shape, consisting of multiple sub-shapes with relative positions.\n */\nexport class Compound extends Shape {\n    readonly type = ShapeType.Compound;\n\n    /**\n     * The shapes composing this compound shape.\n     */\n    shapes: Shape[];\n\n    /**\n     * The positions of each sub-shape relative to the compound's origin.\n     */\n    positions: Vector[];\n\n    /**\n     * The rotations of each sub-shape relative to the compound's orientation.\n     */\n    rotations: Rotation[];\n\n    /**\n     * The compound flags.\n     */\n    flags: CompoundFlags;\n\n    /**\n     * Creates a new compound shape.\n     *\n     * @param shapes - The array of shapes composing this compound. Must not be empty,\n     *                 and must not contain other compound shapes (nested compound shapes\n     *                 are not allowed).\n     * @param positions - The array of positions for each shape.\n     * @param rotations - The array of rotations for each shape.\n     * @param flags - The compound flags.\n     */\n    constructor(\n        shapes: Shape[],\n        positions: Vector[],\n        rotations: Rotation[],\n        flags?: CompoundFlags,\n    ) {\n        super();\n\n        if (\n            shapes.length !== positions.length ||\n            shapes.length !== rotations.length\n        ) {\n            throw new Error(\n                \"shapes, positions, and rotations arrays must have the same length\",\n            );\n        }\n\n        if (shapes.length === 0) {\n            throw new Error(\"a compound shape must contain at least one shape\");\n        }\n\n        if (shapes.some((shape) => shape.type === ShapeType.Compound)) {\n            throw new Error(\"nested compound shapes are not allowed\");\n        }\n\n        this.shapes = shapes;\n        this.positions = positions;\n        this.rotations = rotations;\n        this.flags = flags ?? (0 as CompoundFlags);\n    }\n\n    /**\n     * Reconstructs a compound shape from its raw representation.\n     *\n     * This takes ownership of `rawShape` and always frees it before returning.\n     */\n    public static fromRawShape(rawShape: RawShape): Compound {\n        try {\n            const numShapes = rawShape.compoundLen();\n            if (numShapes == null) {\n                throw new Error(\"Expected a raw compound shape.\");\n            }\n\n            const shapes = new Array<Shape>(numShapes);\n            const positions = new Array<Vector>(numShapes);\n            const rotations = new Array<Rotation>(numShapes);\n\n            for (let i = 0; i < numShapes; i++) {\n                shapes[i] = Shape.fromRawShape(rawShape.compoundShape(i));\n                positions[i] = VectorOps.fromRaw(\n                    rawShape.compoundTranslation(i),\n                );\n                rotations[i] = RotationOps.fromRaw(\n                    rawShape.compoundRotation(i),\n                );\n            }\n\n            return new Compound(\n                shapes,\n                positions,\n                rotations,\n                rawShape.compoundFlags(),\n            );\n        } finally {\n            rawShape.free();\n        }\n    }\n\n    public intoRaw(): RawShape {\n        const rawShapes = this.shapes.map((s) => s.intoRaw());\n\n\n        // #if DIM3\n        const positions = new Float32Array(this.positions.length * 3);\n        this.positions.forEach((pos, i) => {\n            positions[i * 3] = pos.x;\n            positions[i * 3 + 1] = pos.y;\n            positions[i * 3 + 2] = pos.z;\n        });\n\n        const rotations = new Float32Array(this.rotations.length * 4);\n        this.rotations.forEach((rot, i) => {\n            rotations[i * 4] = rot.x;\n            rotations[i * 4 + 1] = rot.y;\n            rotations[i * 4 + 2] = rot.z;\n            rotations[i * 4 + 3] = rot.w;\n        });\n        // #endif\n\n        return RawShape.compound(rawShapes, positions, rotations, this.flags);\n    }\n}\n\n/**\n * A shape that is a triangle mesh.\n */\nexport class TriMesh extends Shape {\n    readonly type = ShapeType.TriMesh;\n\n    /**\n     * The vertices of the triangle mesh.\n     */\n    vertices: Float32Array;\n\n    /**\n     * The indices of the triangles.\n     */\n    indices: Uint32Array;\n\n    /**\n     * The triangle mesh flags.\n     */\n    flags: TriMeshFlags;\n\n    /**\n     * Creates a new triangle mesh shape.\n     *\n     * @param vertices - The coordinates of the triangle mesh's vertices.\n     * @param indices - The indices of the triangle mesh's triangles.\n     */\n    constructor(\n        vertices: Float32Array,\n        indices: Uint32Array,\n        flags?: TriMeshFlags,\n    ) {\n        super();\n        this.vertices = vertices;\n        this.indices = indices;\n        this.flags = flags;\n    }\n\n    public intoRaw(): RawShape {\n        return RawShape.trimesh(this.vertices, this.indices, this.flags);\n    }\n}\n\n\n// #if DIM3\n/**\n * A shape that is a convex polygon.\n */\nexport class ConvexPolyhedron extends Shape {\n    readonly type = ShapeType.ConvexPolyhedron;\n\n    /**\n     * The vertices of the convex polygon.\n     */\n    vertices: Float32Array;\n\n    /**\n     * The indices of the convex polygon.\n     */\n    indices?: Uint32Array | null;\n\n    /**\n     * Creates a new convex polygon shape.\n     *\n     * @param vertices - The coordinates of the convex polygon's vertices.\n     * @param indices - The index buffer of this convex mesh. If this is `null`\n     *   or `undefined`, the convex-hull of the input vertices will be computed\n     *   automatically. Otherwise, it will be assumed that the mesh you provide\n     *   is already convex.\n     */\n    constructor(vertices: Float32Array, indices?: Uint32Array | null) {\n        super();\n        this.vertices = vertices;\n        this.indices = indices;\n    }\n\n    public intoRaw(): RawShape {\n        if (!!this.indices) {\n            return RawShape.convexMesh(this.vertices, this.indices);\n        } else {\n            return RawShape.convexHull(this.vertices);\n        }\n    }\n}\n\n/**\n * A shape that is a convex polygon.\n */\nexport class RoundConvexPolyhedron extends Shape {\n    readonly type = ShapeType.RoundConvexPolyhedron;\n\n    /**\n     * The vertices of the convex polygon.\n     */\n    vertices: Float32Array;\n\n    /**\n     * The indices of the convex polygon.\n     */\n    indices?: Uint32Array;\n\n    /**\n     * The radius of the convex polyhedron's rounded edges and vertices.\n     */\n    borderRadius: number;\n\n    /**\n     * Creates a new convex polygon shape.\n     *\n     * @param vertices - The coordinates of the convex polygon's vertices.\n     * @param indices - The index buffer of this convex mesh. If this is `null`\n     *   or `undefined`, the convex-hull of the input vertices will be computed\n     *   automatically. Otherwise, it will be assumed that the mesh you provide\n     *   is already convex.\n     * @param borderRadius - The radius of the borders of this convex polyhedron.\n     */\n    constructor(\n        vertices: Float32Array,\n        indices: Uint32Array | null | undefined,\n        borderRadius: number,\n    ) {\n        super();\n        this.vertices = vertices;\n        this.indices = indices;\n        this.borderRadius = borderRadius;\n    }\n\n    public intoRaw(): RawShape {\n        if (!!this.indices) {\n            return RawShape.roundConvexMesh(\n                this.vertices,\n                this.indices,\n                this.borderRadius,\n            );\n        } else {\n            return RawShape.roundConvexHull(this.vertices, this.borderRadius);\n        }\n    }\n}\n\n/**\n * A shape that is a heightfield.\n */\nexport class Heightfield extends Shape {\n    readonly type = ShapeType.HeightField;\n\n    /**\n     * The number of rows in the heights matrix.\n     */\n    nrows: number;\n\n    /**\n     * The number of columns in the heights matrix.\n     */\n    ncols: number;\n\n    /**\n     * The heights of the heightfield along its local `y` axis,\n     * provided as a matrix stored in column-major order.\n     */\n    heights: Float32Array;\n\n    /**\n     * The dimensions of the heightfield's local `x,z` plane.\n     */\n    scale: Vector;\n\n    /**\n     * Flags applied to the heightfield.\n     */\n    flags: HeightFieldFlags;\n\n    /**\n     * Creates a new heightfield shape.\n     *\n     * @param nrows − The number of rows in the heights matrix.\n     * @param ncols - The number of columns in the heights matrix.\n     * @param heights - The heights of the heightfield along its local `y` axis,\n     *                  provided as a matrix stored in column-major order.\n     * @param scale - The dimensions of the heightfield's local `x,z` plane.\n     */\n    constructor(\n        nrows: number,\n        ncols: number,\n        heights: Float32Array,\n        scale: Vector,\n        flags?: HeightFieldFlags,\n    ) {\n        super();\n        this.nrows = nrows;\n        this.ncols = ncols;\n        this.heights = heights;\n        this.scale = scale;\n        this.flags = flags;\n    }\n\n    public intoRaw(): RawShape {\n        let rawScale = VectorOps.intoRaw(this.scale);\n        let rawShape = RawShape.heightfield(\n            this.nrows,\n            this.ncols,\n            this.heights,\n            rawScale,\n            this.flags,\n        );\n        rawScale.free();\n        return rawShape;\n    }\n}\n\n/**\n * A shape that is a 3D cylinder.\n */\nexport class Cylinder extends Shape {\n    readonly type = ShapeType.Cylinder;\n\n    /**\n     * The radius of the cylinder's basis.\n     */\n    radius: number;\n\n    /**\n     * The cylinder's half height, along the `y` axis.\n     */\n    halfHeight: number;\n\n    /**\n     * Creates a new cylinder with the given radius and half-height.\n     * @param halfHeight - The balls half-height along the `y` axis.\n     * @param radius - The balls radius.\n     */\n    constructor(halfHeight: number, radius: number) {\n        super();\n        this.halfHeight = halfHeight;\n        this.radius = radius;\n    }\n\n    public intoRaw(): RawShape {\n        return RawShape.cylinder(this.halfHeight, this.radius);\n    }\n}\n\n/**\n * A shape that is a 3D cylinder with round corners.\n */\nexport class RoundCylinder extends Shape {\n    readonly type = ShapeType.RoundCylinder;\n\n    /**\n     * The radius of the cylinder's basis.\n     */\n    radius: number;\n\n    /**\n     * The cylinder's half height, along the `y` axis.\n     */\n    halfHeight: number;\n\n    /**\n     * The radius of the cylinder's rounded edges and vertices.\n     */\n    borderRadius: number;\n\n    /**\n     * Creates a new cylinder with the given radius and half-height.\n     * @param halfHeight - The balls half-height along the `y` axis.\n     * @param radius - The balls radius.\n     * @param borderRadius - The radius of the borders of this cylinder.\n     */\n    constructor(halfHeight: number, radius: number, borderRadius: number) {\n        super();\n        this.borderRadius = borderRadius;\n        this.halfHeight = halfHeight;\n        this.radius = radius;\n    }\n\n    public intoRaw(): RawShape {\n        return RawShape.roundCylinder(\n            this.halfHeight,\n            this.radius,\n            this.borderRadius,\n        );\n    }\n}\n\n/**\n * A shape that is a 3D cone.\n */\nexport class Cone extends Shape {\n    readonly type = ShapeType.Cone;\n\n    /**\n     * The radius of the cone's basis.\n     */\n    radius: number;\n\n    /**\n     * The cone's half height, along the `y` axis.\n     */\n    halfHeight: number;\n\n    /**\n     * Creates a new cone with the given radius and half-height.\n     * @param halfHeight - The balls half-height along the `y` axis.\n     * @param radius - The balls radius.\n     */\n    constructor(halfHeight: number, radius: number) {\n        super();\n        this.halfHeight = halfHeight;\n        this.radius = radius;\n    }\n\n    public intoRaw(): RawShape {\n        return RawShape.cone(this.halfHeight, this.radius);\n    }\n}\n\n/**\n * A shape that is a 3D cone with round corners.\n */\nexport class RoundCone extends Shape {\n    readonly type = ShapeType.RoundCone;\n\n    /**\n     * The radius of the cone's basis.\n     */\n    radius: number;\n\n    /**\n     * The cone's half height, along the `y` axis.\n     */\n    halfHeight: number;\n\n    /**\n     * The radius of the cylinder's rounded edges and vertices.\n     */\n    borderRadius: number;\n\n    /**\n     * Creates a new cone with the given radius and half-height.\n     * @param halfHeight - The balls half-height along the `y` axis.\n     * @param radius - The balls radius.\n     * @param borderRadius - The radius of the borders of this cone.\n     */\n    constructor(halfHeight: number, radius: number, borderRadius: number) {\n        super();\n        this.halfHeight = halfHeight;\n        this.radius = radius;\n        this.borderRadius = borderRadius;\n    }\n\n    public intoRaw(): RawShape {\n        return RawShape.roundCone(\n            this.halfHeight,\n            this.radius,\n            this.borderRadius,\n        );\n    }\n}\n\n// #endif\n","import {RawPidController} from \"../raw\";\nimport {Rotation, RotationOps, scratchBuffer, Vector, VectorOps} from \"../math\";\nimport {Collider, ColliderSet, InteractionGroups, Shape} from \"../geometry\";\nimport {QueryFilterFlags, World} from \"../pipeline\";\nimport {IntegrationParameters, RigidBody, RigidBodySet} from \"../dynamics\";\n\n// TODO: unify with the JointAxesMask\n/**\n * An enum representing the possible joint axes controlled by a PidController.\n * They can be ORed together, like:\n * PidAxesMask.LinX || PidAxesMask.LinY\n * to get a pid controller that only constraints the translational X and Y axes.\n *\n * Possible axes are:\n *\n * - `X`: X translation axis\n * - `Y`: Y translation axis\n * - `Z`: Z translation axis\n * - `AngX`: X angular rotation axis (3D only)\n * - `AngY`: Y angular rotation axis (3D only)\n * - `AngZ`: Z angular rotation axis\n */\nexport enum PidAxesMask {\n    None = 0,\n    LinX = 1 << 0,\n    LinY = 1 << 1,\n    LinZ = 1 << 2,\n    // #if DIM3\n    AngX = 1 << 3,\n    AngY = 1 << 4,\n    // #endif\n    AngZ = 1 << 5,\n    // #if DIM3\n    AllLin = PidAxesMask.LinX | PidAxesMask.LinY | PidAxesMask.LinZ,\n    AllAng = PidAxesMask.AngX | PidAxesMask.AngY | PidAxesMask.AngZ,\n    // #endif\n    All = PidAxesMask.AllLin | PidAxesMask.AllAng,\n}\n\n/**\n * A controller for controlling dynamic bodies using the\n * Proportional-Integral-Derivative correction model.\n */\nexport class PidController {\n    private raw: RawPidController;\n\n    private params: IntegrationParameters;\n    private bodies: RigidBodySet;\n\n    constructor(\n        params: IntegrationParameters,\n        bodies: RigidBodySet,\n        kp: number,\n        ki: number,\n        kd: number,\n        axes: PidAxesMask,\n    ) {\n        this.params = params;\n        this.bodies = bodies;\n        this.raw = new RawPidController(kp, ki, kd, axes);\n    }\n\n    /** @internal */\n    public free() {\n        if (!!this.raw) {\n            this.raw.free();\n        }\n\n        this.raw = undefined;\n    }\n\n    public setKp(kp: number, axes: PidAxesMask) {\n        this.raw.set_kp(kp, axes);\n    }\n\n    public setKi(ki: number, axes: PidAxesMask) {\n        this.raw.set_kp(ki, axes);\n    }\n\n    public setKd(kd: number, axes: PidAxesMask) {\n        this.raw.set_kp(kd, axes);\n    }\n\n    public setAxes(axes: PidAxesMask) {\n        this.raw.set_axes_mask(axes);\n    }\n\n    public resetIntegrals() {\n        this.raw.reset_integrals();\n    }\n\n    public applyLinearCorrection(\n        body: RigidBody,\n        targetPosition: Vector,\n        targetLinvel: Vector,\n    ) {\n        let rawPos = VectorOps.intoRaw(targetPosition);\n        let rawVel = VectorOps.intoRaw(targetLinvel);\n        this.raw.apply_linear_correction(\n            this.params.dt,\n            this.bodies.raw,\n            body.handle,\n            rawPos,\n            rawVel,\n        );\n        rawPos.free();\n        rawVel.free();\n    }\n\n\n    // #if DIM3\n    public applyAngularCorrection(\n        body: RigidBody,\n        targetRotation: Rotation,\n        targetAngVel: Vector,\n    ) {\n        let rawPos = RotationOps.intoRaw(targetRotation);\n        let rawVel = VectorOps.intoRaw(targetAngVel);\n        this.raw.apply_angular_correction(\n            this.params.dt,\n            this.bodies.raw,\n            body.handle,\n            rawPos,\n            rawVel,\n        );\n        rawPos.free();\n        rawVel.free();\n    }\n    // #endif\n\n    public linearCorrection(\n        body: RigidBody,\n        targetPosition: Vector,\n        targetLinvel: Vector,\n        target?: Vector,\n    ): Vector {\n        let rawPos = VectorOps.intoRaw(targetPosition);\n        let rawVel = VectorOps.intoRaw(targetLinvel);\n        this.raw.linear_correction(\n            this.params.dt,\n            this.bodies.raw,\n            body.handle,\n            rawPos,\n            rawVel,\n            scratchBuffer,\n        );\n        rawPos.free();\n        rawVel.free();\n\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n\n    // #if DIM3\n    public angularCorrection(\n        body: RigidBody,\n        targetRotation: Rotation,\n        targetAngVel: Vector,\n        target?: Vector,\n    ): Vector {\n        let rawPos = RotationOps.intoRaw(targetRotation);\n        let rawVel = VectorOps.intoRaw(targetAngVel);\n        this.raw.angular_correction(\n            this.params.dt,\n            this.bodies.raw,\n            body.handle,\n            rawPos,\n            rawVel,\n            scratchBuffer,\n        );\n        rawPos.free();\n        rawVel.free();\n\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n    // #endif\n}\n","import {\n    RawContactForceEvent,\n    RawEventQueue,\n    RawSoftBodyTearEvent,\n} from \"../raw\";\nimport {RigidBodyHandle, SoftBodyTearEvent} from \"../dynamics\";\nimport {Collider, ColliderHandle} from \"../geometry\";\nimport {Vector, VectorOps, scratchBuffer} from \"../math\";\n\n/**\n * Flags indicating what events are enabled for colliders.\n */\nexport enum ActiveEvents {\n    NONE = 0,\n    /**\n     * Enable collision events.\n     */\n    COLLISION_EVENTS = 0b0001,\n    /**\n     * Enable contact force events.\n     */\n    CONTACT_FORCE_EVENTS = 0b0010,\n}\n\n/**\n * Event occurring when the sum of the magnitudes of the\n * contact forces between two colliders exceed a threshold.\n *\n * This object should **not** be stored anywhere. Its properties can only be\n * read from within the closure given to `EventHandler.drainContactForceEvents`.\n */\nexport class TempContactForceEvent {\n    raw: RawContactForceEvent;\n\n    public free() {\n        if (!!this.raw) {\n            this.raw.free();\n        }\n        this.raw = undefined;\n    }\n\n    /**\n     * The first collider involved in the contact.\n     */\n    public collider1(): ColliderHandle {\n        return this.raw.collider1();\n    }\n\n    /**\n     * The second collider involved in the contact.\n     */\n    public collider2(): ColliderHandle {\n        return this.raw.collider2();\n    }\n\n    /**\n     * The sum of all the forces between the two colliders.\n     */\n    public totalForce(target?: Vector): Vector {\n        this.raw.total_force(scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n    /**\n     * The sum of the magnitudes of each force between the two colliders.\n     *\n     * Note that this is **not** the same as the magnitude of `self.total_force`.\n     * Here we are summing the magnitude of all the forces, instead of taking\n     * the magnitude of their sum.\n     */\n    public totalForceMagnitude(): number {\n        return this.raw.total_force_magnitude();\n    }\n\n    /**\n     * The world-space (unit) direction of the force with strongest magnitude.\n     */\n    public maxForceDirection(target?: Vector): Vector {\n        this.raw.max_force_direction(scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n    /**\n     * The magnitude of the largest force at a contact point of this contact pair.\n     */\n    public maxForceMagnitude(): number {\n        return this.raw.max_force_magnitude();\n    }\n}\n\n/**\n * A structure responsible for collecting events generated\n * by the physics engine.\n *\n * To avoid leaking WASM resources, this MUST be freed manually with `eventQueue.free()`\n * once you are done using it.\n */\nexport class EventQueue {\n    raw: RawEventQueue;\n\n    /**\n     * Creates a new event collector.\n     *\n     * @param autoDrain -setting this to `true` is strongly recommended. If true, the collector will\n     * be automatically drained before each `world.step(collector)`. If false, the collector will\n     * keep all events in memory unless it is manually drained/cleared; this may lead to unbounded use of\n     * RAM if no drain is performed.\n     */\n    constructor(autoDrain: boolean, raw?: RawEventQueue) {\n        this.raw = raw || new RawEventQueue(autoDrain);\n    }\n\n    /**\n     * Release the WASM memory occupied by this event-queue.\n     */\n    public free() {\n        if (!!this.raw) {\n            this.raw.free();\n        }\n        this.raw = undefined;\n    }\n\n    /**\n     * Applies the given javascript closure on each collision event of this collector, then clear\n     * the internal collision event buffer.\n     *\n     * @param f - JavaScript closure applied to each collision event. The\n     * closure must take three arguments: two integers representing the handles of the colliders\n     * involved in the collision, and a boolean indicating if the collision started (true) or stopped\n     * (false).\n     */\n    public drainCollisionEvents(\n        f: (\n            handle1: ColliderHandle,\n            handle2: ColliderHandle,\n            started: boolean,\n        ) => void,\n    ) {\n        this.raw.drainCollisionEvents(f);\n    }\n\n    /**\n     * Applies the given javascript closure on each contact force event of this collector, then clear\n     * the internal collision event buffer.\n     *\n     * @param f - JavaScript closure applied to each collision event. The\n     *            closure must take one `TempContactForceEvent` argument.\n     */\n    public drainContactForceEvents(f: (event: TempContactForceEvent) => void) {\n        let event = new TempContactForceEvent();\n        this.raw.drainContactForceEvents((raw: RawContactForceEvent) => {\n            event.raw = raw;\n            f(event);\n            event.free();\n        });\n    }\n\n    /**\n     * Applies the given javascript closure on each soft-body tear event of this collector,\n     * then clears the internal tear event buffer.\n     *\n     * The pieces a tear split off are only wrapped once `World.mapNewSoftBodies` (called by\n     * `World.step` after draining) ran; the event itself is only valid inside the closure.\n     *\n     * @param f - JavaScript closure applied to each tear event. The closure must take one\n     *            `SoftBodyTearEvent` argument.\n     */\n    public drainSoftBodyTearEvents(f: (event: SoftBodyTearEvent) => void) {\n        let event = new SoftBodyTearEvent();\n        this.raw.drainSoftBodyTearEvents((raw: RawSoftBodyTearEvent) => {\n            event.raw = raw;\n            f(event);\n            event.free();\n        });\n    }\n\n    /**\n     * Removes all events contained by this collector\n     */\n    public clear() {\n        this.raw.clear();\n    }\n}\n","import {RigidBodyHandle} from \"../dynamics\";\nimport {ColliderHandle} from \"../geometry\";\n\nexport enum ActiveHooks {\n    NONE = 0,\n    FILTER_CONTACT_PAIRS = 0b0001,\n    FILTER_INTERSECTION_PAIRS = 0b0010,\n    // MODIFY_SOLVER_CONTACTS = 0b0100, /* Not supported yet in JS. */\n}\n\nexport enum SolverFlags {\n    EMPTY = 0b000,\n    COMPUTE_IMPULSE = 0b001,\n}\n\nexport interface PhysicsHooks {\n    /**\n     * Function that determines if contacts computation should happen between two colliders, and how the\n     * constraints solver should behave for these contacts.\n     *\n     * This will only be executed and taken into account if at least one of the involved colliders contains the\n     * `ActiveHooks.FILTER_CONTACT_PAIR` flag in its active hooks.\n     *\n     * @param collider1 − Handle of the first collider involved in the potential contact.\n     * @param collider2 − Handle of the second collider involved in the potential contact.\n     * @param body1 − Handle of the first body involved in the potential contact.\n     * @param body2 − Handle of the second body involved in the potential contact.\n     */\n    filterContactPair(\n        collider1: ColliderHandle,\n        collider2: ColliderHandle,\n        body1: RigidBodyHandle,\n        body2: RigidBodyHandle,\n    ): SolverFlags | null;\n\n    /**\n     * Function that determines if intersection computation should happen between two colliders (where at least\n     * one is a sensor).\n     *\n     * This will only be executed and taken into account if `one of the involved colliders contains the\n     * `ActiveHooks.FILTER_INTERSECTION_PAIR` flag in its active hooks.\n     *\n     * @param collider1 − Handle of the first collider involved in the potential contact.\n     * @param collider2 − Handle of the second collider involved in the potential contact.\n     * @param body1 − Handle of the first body involved in the potential contact.\n     * @param body2 − Handle of the second body involved in the potential contact.\n     */\n    filterIntersectionPair(\n        collider1: ColliderHandle,\n        collider2: ColliderHandle,\n        body1: RigidBodyHandle,\n        body2: RigidBodyHandle,\n    ): boolean;\n}\n","import {RawRayColliderIntersection} from \"../raw\";\nimport {\n    ColliderHandle,\n    ColliderSet,\n    InteractionGroups,\n    PointColliderProjection,\n    Ray,\n    RayColliderIntersection,\n    RayColliderHit,\n    Shape,\n    ColliderShapeCastHit,\n} from \"../geometry\";\nimport {IslandManager, RigidBodyHandle, RigidBodySet} from \"../dynamics\";\nimport {Rotation, RotationOps, Vector, VectorOps} from \"../math\";\n\n// NOTE: must match the bits in the QueryFilterFlags on the Rust side.\n/**\n * Flags for excluding whole sets of colliders from a scene query.\n */\nexport enum QueryFilterFlags {\n    /**\n     * Exclude from the query any collider attached to a fixed rigid-body and colliders with no rigid-body attached.\n     */\n    EXCLUDE_FIXED = 0b0000_0001,\n    /**\n     * Exclude from the query any collider attached to a dynamic rigid-body.\n     */\n    EXCLUDE_KINEMATIC = 0b0000_0010,\n    /**\n     * Exclude from the query any collider attached to a kinematic rigid-body.\n     */\n    EXCLUDE_DYNAMIC = 0b0000_0100,\n    /**\n     * Exclude from the query any collider that is a sensor.\n     */\n    EXCLUDE_SENSORS = 0b0000_1000,\n    /**\n     * Exclude from the query any collider that is not a sensor.\n     */\n    EXCLUDE_SOLIDS = 0b0001_0000,\n    /**\n     * Excludes all colliders not attached to a dynamic rigid-body.\n     */\n    ONLY_DYNAMIC = QueryFilterFlags.EXCLUDE_FIXED |\n        QueryFilterFlags.EXCLUDE_KINEMATIC,\n    /**\n     * Excludes all colliders not attached to a kinematic rigid-body.\n     */\n    ONLY_KINEMATIC = QueryFilterFlags.EXCLUDE_DYNAMIC |\n        QueryFilterFlags.EXCLUDE_FIXED,\n    /**\n     * Exclude all colliders attached to a non-fixed rigid-body\n     * (this will not exclude colliders not attached to any rigid-body).\n     */\n    ONLY_FIXED = QueryFilterFlags.EXCLUDE_DYNAMIC |\n        QueryFilterFlags.EXCLUDE_KINEMATIC,\n}\n","import {RawColliderSet, RawShape, RawVHACDParameters} from \"../raw\";\nimport {Rotation, RotationOps, Vector, VectorOps, scratchBuffer} from \"../math\";\nimport {CoefficientCombineRule, RigidBody, RigidBodySet} from \"../dynamics\";\nimport {ActiveHooks, ActiveEvents} from \"../pipeline\";\nimport {InteractionGroups} from \"./interaction_groups\";\nimport {\n    Shape,\n    Cuboid,\n    Ball,\n    ShapeType,\n    Capsule,\n    Voxels,\n    TriMesh,\n    Polyline,\n    Heightfield,\n    Compound,\n    Segment,\n    Triangle,\n    RoundTriangle,\n    RoundCuboid,\n    HalfSpace,\n    TriMeshFlags,\n    // #if DIM3\n    Cylinder,\n    RoundCylinder,\n    Cone,\n    RoundCone,\n    ConvexPolyhedron,\n    RoundConvexPolyhedron,\n    HeightFieldFlags,\n    // #endif,\n    PolylineFlags,\n    CompoundFlags,\n} from \"./shape\";\nimport {Ray, RayIntersection} from \"./ray\";\nimport {PointProjection} from \"./point\";\nimport {ColliderShapeCastHit, ShapeCastHit} from \"./toi\";\nimport {ShapeContact} from \"./contact\";\nimport {ColliderSet} from \"./collider_set\";\n\n/**\n * Parameters for VHACD convex decomposition algorithm.\n *\n * All parameters are optional. When not specified, default values from the\n * underlying Rapier/Parry library are used.\n */\nexport interface VHACDParameters {\n    /**\n     * Controls the bias toward clipping along symmetry planes.\n     * Range: [0.0, 1.0]\n     */\n    alpha?: number;\n\n    /**\n     * Controls the bias toward clipping along revolution planes.\n     * Range: [0.0, 1.0]\n     * Useful for objects with cylindrical or rotational features.\n     */\n    beta?: number;\n\n    /**\n     * Controls maximum allowed deviation from convexity.\n     * Range: [0.0, 1.0]\n     * Lower values create more convex parts for a tighter fit.\n     */\n    concavity?: number;\n\n    /**\n     * Controls the granularity of searching optimal clipping planes.\n     * Lower values test more planes (slower but more accurate).\n     */\n    planeDownsampling?: number;\n\n    /**\n     * Controls the precision of convex hull generation.\n     * Lower values use more voxels for hull computation.\n     */\n    convexHullDownsampling?: number;\n\n    /**\n     * Maximum number of convex parts to generate.\n     * Limits part count during decomposition.\n     */\n    maxConvexHulls?: number;\n\n    /**\n     * Voxel grid resolution for decomposition.\n     * Higher resolution captures more detail but is slower.\n     */\n    resolution?: number;\n\n    /**\n     * Whether to use approximate convex hulls for better performance.\n     * Faster method with minimal impact on quality.\n     */\n    convexHullApproximation?: boolean;\n}\n\n/**\n * Flags affecting whether collision-detection happens between two colliders\n * depending on the type of rigid-bodies they are attached to.\n */\nexport enum ActiveCollisionTypes {\n    /**\n     * Enable collision-detection between a collider attached to a dynamic body\n     * and another collider attached to a dynamic body.\n     */\n    DYNAMIC_DYNAMIC = 0b0000_0000_0000_0001,\n    /**\n     * Enable collision-detection between a collider attached to a dynamic body\n     * and another collider attached to a kinematic body.\n     */\n    DYNAMIC_KINEMATIC = 0b0000_0000_0000_1100,\n    /**\n     * Enable collision-detection between a collider attached to a dynamic body\n     * and another collider attached to a fixed body (or not attached to any body).\n     */\n    DYNAMIC_FIXED = 0b0000_0000_0000_0010,\n    /**\n     * Enable collision-detection between a collider attached to a kinematic body\n     * and another collider attached to a kinematic body.\n     */\n    KINEMATIC_KINEMATIC = 0b1100_1100_0000_0000,\n\n    /**\n     * Enable collision-detection between a collider attached to a kinematic body\n     * and another collider attached to a fixed body (or not attached to any body).\n     */\n    KINEMATIC_FIXED = 0b0010_0010_0000_0000,\n\n    /**\n     * Enable collision-detection between a collider attached to a fixed body (or\n     * not attached to any body) and another collider attached to a fixed body (or\n     * not attached to any body).\n     */\n    FIXED_FIXED = 0b0000_0000_0010_0000,\n    /**\n     * The default active collision types, enabling collisions between a dynamic body\n     * and another body of any type, but not enabling collisions between two non-dynamic bodies.\n     */\n    DEFAULT = DYNAMIC_KINEMATIC | DYNAMIC_DYNAMIC | DYNAMIC_FIXED,\n    /**\n     * Enable collisions between any kind of rigid-bodies (including between two non-dynamic bodies).\n     */\n    ALL = DYNAMIC_KINEMATIC |\n        DYNAMIC_DYNAMIC |\n        DYNAMIC_FIXED |\n        KINEMATIC_KINEMATIC |\n        KINEMATIC_FIXED |\n        KINEMATIC_KINEMATIC,\n}\n\n/**\n * The integer identifier of a collider added to a `ColliderSet`.\n */\nexport type ColliderHandle = number;\n\n/**\n * A geometric entity that can be attached to a body so it can be affected\n * by contacts and proximity queries.\n */\nexport class Collider {\n    private colliderSet: ColliderSet; // The Collider won't need to free this.\n    readonly handle: ColliderHandle;\n    private _shape: Shape; // TODO: deprecate/remove this since it isn’t a reliable way of getting the latest shape properties.\n    private _parent: RigidBody | null;\n\n    constructor(\n        colliderSet: ColliderSet,\n        handle: ColliderHandle,\n        parent: RigidBody | null,\n        shape?: Shape,\n    ) {\n        this.colliderSet = colliderSet;\n        this.handle = handle;\n        this._parent = parent;\n        this._shape = shape;\n    }\n\n    /** @internal */\n    public finalizeDeserialization(bodies: RigidBodySet) {\n        if (this.handle != null) {\n            this._parent = bodies.get(\n                this.colliderSet.raw.coParent(this.handle),\n            );\n        }\n    }\n\n    private ensureShapeIsCached() {\n        if (!this._shape)\n            this._shape = Shape.fromRaw(this.colliderSet.raw, this.handle);\n    }\n\n    /**\n     * The shape of this collider.\n     */\n    public get shape(): Shape {\n        this.ensureShapeIsCached();\n        return this._shape;\n    }\n\n    /**\n     * Set the internal cached JS shape to null.\n     *\n     * This can be useful if you want to free some memory (assuming you are not\n     * holding any other references to the shape object), or in order to force\n     * the recalculation of the JS shape (the next time the `shape` getter is\n     * accessed) from the WASM source of truth.\n     */\n    public clearShapeCache() {\n        this._shape = null;\n    }\n\n    /**\n     * Checks if this collider is still valid (i.e. that it has\n     * not been deleted from the collider set yet).\n     */\n    public isValid(): boolean {\n        return this.colliderSet.raw.contains(this.handle);\n    }\n\n    /**\n     * The world-space translation of this collider.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public translation(target?: Vector): Vector {\n        this.colliderSet.raw.coTranslation(this.handle, scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n    /**\n     * The translation of this collider relative to its parent rigid-body.\n     *\n     * Returns `null` if the collider doesn’t have a parent rigid-body.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public translationWrtParent(target?: Vector): Vector | null {\n        const hasParent = this.colliderSet.raw.coTranslationWrtParent(\n            this.handle,\n            scratchBuffer,\n        );\n        return hasParent ? VectorOps.fromBuffer(scratchBuffer, target) : null;\n    }\n\n\n    // #if DIM3\n    /**\n     * The world-space orientation of this collider.\n     *\n     * @param {Rotation?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public rotation(target?: Rotation): Rotation {\n        this.colliderSet.raw.coRotation(this.handle, scratchBuffer);\n        return RotationOps.fromBuffer(scratchBuffer, target);\n    }\n    // #endif\n\n\n    // #if DIM3\n    /**\n     * The orientation of this collider relative to its parent rigid-body.\n     *\n     * Returns `null` if the collider doesn’t have a parent rigid-body.\n     *\n     * @param {Rotation?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public rotationWrtParent(target?: Rotation): Rotation | null {\n        const hasParent = this.colliderSet.raw.coRotationWrtParent(\n            this.handle,\n            scratchBuffer,\n        );\n        return hasParent ? RotationOps.fromBuffer(scratchBuffer, target) : null;\n    }\n    // #endif\n\n    /**\n     * Is this collider a sensor?\n     */\n    public isSensor(): boolean {\n        return this.colliderSet.raw.coIsSensor(this.handle);\n    }\n\n    /**\n     * Sets whether this collider is a sensor.\n     * @param isSensor - If `true`, the collider will be a sensor.\n     */\n    public setSensor(isSensor: boolean) {\n        this.colliderSet.raw.coSetSensor(this.handle, isSensor);\n    }\n\n    /**\n     * Sets the new shape of the collider.\n     * @param shape - The collider’s new shape.\n     */\n    public setShape(shape: Shape) {\n        let rawShape = shape.intoRaw();\n        this.colliderSet.raw.coSetShape(this.handle, rawShape);\n        rawShape.free();\n        this._shape = shape;\n    }\n\n    /**\n     * Sets whether this collider is enabled or not.\n     *\n     * @param enabled - Set to `false` to disable this collider (its parent rigid-body won’t be disabled automatically by this).\n     */\n    public setEnabled(enabled: boolean) {\n        this.colliderSet.raw.coSetEnabled(this.handle, enabled);\n    }\n\n    /**\n     * Is this collider enabled?\n     */\n    public isEnabled(): boolean {\n        return this.colliderSet.raw.coIsEnabled(this.handle);\n    }\n\n    /**\n     * Sets the restitution coefficient of the collider to be created.\n     *\n     * @param restitution - The restitution coefficient in `[0, 1]`. A value of 0 (the default) means no bouncing behavior\n     *                   while 1 means perfect bouncing (though energy may still be lost due to numerical errors of the\n     *                   constraints solver).\n     */\n    public setRestitution(restitution: number) {\n        this.colliderSet.raw.coSetRestitution(this.handle, restitution);\n    }\n\n    /**\n     * Sets the friction coefficient of the collider to be created.\n     *\n     * @param friction - The friction coefficient. Must be greater or equal to 0. This is generally smaller than 1. The\n     *                   higher the coefficient, the stronger friction forces will be for contacts with the collider\n     *                   being built.\n     */\n    public setFriction(friction: number) {\n        this.colliderSet.raw.coSetFriction(this.handle, friction);\n    }\n\n    /**\n     * Gets the rule used to combine the friction coefficients of two colliders\n     * colliders involved in a contact.\n     */\n    public frictionCombineRule(): CoefficientCombineRule {\n        return this.colliderSet.raw.coFrictionCombineRule(this.handle);\n    }\n\n    /**\n     * Sets the rule used to combine the friction coefficients of two colliders\n     * colliders involved in a contact.\n     *\n     * @param rule − The combine rule to apply.\n     */\n    public setFrictionCombineRule(rule: CoefficientCombineRule) {\n        this.colliderSet.raw.coSetFrictionCombineRule(this.handle, rule);\n    }\n\n    /**\n     * Gets the rule used to combine the restitution coefficients of two colliders\n     * colliders involved in a contact.\n     */\n    public restitutionCombineRule(): CoefficientCombineRule {\n        return this.colliderSet.raw.coRestitutionCombineRule(this.handle);\n    }\n\n    /**\n     * Sets the rule used to combine the restitution coefficients of two colliders\n     * colliders involved in a contact.\n     *\n     * @param rule − The combine rule to apply.\n     */\n    public setRestitutionCombineRule(rule: CoefficientCombineRule) {\n        this.colliderSet.raw.coSetRestitutionCombineRule(this.handle, rule);\n    }\n\n    /**\n     * Sets the collision groups used by this collider.\n     *\n     * Two colliders will interact iff. their collision groups are compatible.\n     * See the documentation of `InteractionGroups` for details on the used bit pattern.\n     *\n     * @param groups - The collision groups used for the collider being built.\n     */\n    public setCollisionGroups(groups: InteractionGroups) {\n        this.colliderSet.raw.coSetCollisionGroups(this.handle, groups);\n    }\n\n    /**\n     * Sets the solver groups used by this collider.\n     *\n     * Forces between two colliders in contact will be computed iff their solver\n     * groups are compatible.\n     * See the documentation of `InteractionGroups` for details on the used bit pattern.\n     *\n     * @param groups - The solver groups used for the collider being built.\n     */\n    public setSolverGroups(groups: InteractionGroups) {\n        this.colliderSet.raw.coSetSolverGroups(this.handle, groups);\n    }\n\n    /**\n     * Sets the contact skin for this collider.\n     *\n     * See the documentation of `ColliderDesc.setContactSkin` for additional details.\n     */\n    public contactSkin(): number {\n        return this.colliderSet.raw.coContactSkin(this.handle);\n    }\n\n    /**\n     * Sets the contact skin for this collider.\n     *\n     * See the documentation of `ColliderDesc.setContactSkin` for additional details.\n     *\n     * @param thickness - The contact skin thickness.\n     */\n    public setContactSkin(thickness: number) {\n        return this.colliderSet.raw.coSetContactSkin(this.handle, thickness);\n    }\n\n    /**\n     * Get the physics hooks active for this collider.\n     */\n    public activeHooks(): ActiveHooks {\n        return this.colliderSet.raw.coActiveHooks(this.handle);\n    }\n\n    /**\n     * Set the physics hooks active for this collider.\n     *\n     * Use this to enable custom filtering rules for contact/intersecstion pairs involving this collider.\n     *\n     * @param activeHooks - The hooks active for contact/intersection pairs involving this collider.\n     */\n    public setActiveHooks(activeHooks: ActiveHooks) {\n        this.colliderSet.raw.coSetActiveHooks(this.handle, activeHooks);\n    }\n\n    /**\n     * The events active for this collider.\n     */\n    public activeEvents(): ActiveEvents {\n        return this.colliderSet.raw.coActiveEvents(this.handle);\n    }\n\n    /**\n     * Set the events active for this collider.\n     *\n     * Use this to enable contact and/or intersection event reporting for this collider.\n     *\n     * @param activeEvents - The events active for contact/intersection pairs involving this collider.\n     */\n    public setActiveEvents(activeEvents: ActiveEvents) {\n        this.colliderSet.raw.coSetActiveEvents(this.handle, activeEvents);\n    }\n\n    /**\n     * Gets the collision types active for this collider.\n     */\n    public activeCollisionTypes(): ActiveCollisionTypes {\n        return this.colliderSet.raw.coActiveCollisionTypes(this.handle);\n    }\n\n    /**\n     * Sets the total force magnitude beyond which a contact force event can be emitted.\n     *\n     * @param threshold - The new force threshold.\n     */\n    public setContactForceEventThreshold(threshold: number) {\n        return this.colliderSet.raw.coSetContactForceEventThreshold(\n            this.handle,\n            threshold,\n        );\n    }\n\n    /**\n     * The total force magnitude beyond which a contact force event can be emitted.\n     */\n    public contactForceEventThreshold(): number {\n        return this.colliderSet.raw.coContactForceEventThreshold(this.handle);\n    }\n\n    /**\n     * Set the collision types active for this collider.\n     *\n     * @param activeCollisionTypes - The hooks active for contact/intersection pairs involving this collider.\n     */\n    public setActiveCollisionTypes(activeCollisionTypes: ActiveCollisionTypes) {\n        this.colliderSet.raw.coSetActiveCollisionTypes(\n            this.handle,\n            activeCollisionTypes,\n        );\n    }\n\n    /**\n     * Sets the uniform density of this collider.\n     *\n     * This will override any previous mass-properties set by `this.setDensity`,\n     * `this.setMass`, `this.setMassProperties`, `ColliderDesc.density`,\n     * `ColliderDesc.mass`, or `ColliderDesc.massProperties` for this collider.\n     *\n     * The mass and angular inertia of this collider will be computed automatically based on its\n     * shape.\n     */\n    public setDensity(density: number) {\n        this.colliderSet.raw.coSetDensity(this.handle, density);\n    }\n\n    /**\n     * Sets the mass of this collider.\n     *\n     * This will override any previous mass-properties set by `this.setDensity`,\n     * `this.setMass`, `this.setMassProperties`, `ColliderDesc.density`,\n     * `ColliderDesc.mass`, or `ColliderDesc.massProperties` for this collider.\n     *\n     * The angular inertia of this collider will be computed automatically based on its shape\n     * and this mass value.\n     */\n    public setMass(mass: number) {\n        this.colliderSet.raw.coSetMass(this.handle, mass);\n    }\n\n    // #if DIM3\n    /**\n     * Sets the mass of this collider.\n     *\n     * This will override any previous mass-properties set by `this.setDensity`,\n     * `this.setMass`, `this.setMassProperties`, `ColliderDesc.density`,\n     * `ColliderDesc.mass`, or `ColliderDesc.massProperties` for this collider.\n     */\n    public setMassProperties(\n        mass: number,\n        centerOfMass: Vector,\n        principalAngularInertia: Vector,\n        angularInertiaLocalFrame: Rotation,\n    ) {\n        let rawCom = VectorOps.intoRaw(centerOfMass);\n        let rawPrincipalInertia = VectorOps.intoRaw(principalAngularInertia);\n        let rawInertiaFrame = RotationOps.intoRaw(angularInertiaLocalFrame);\n\n        this.colliderSet.raw.coSetMassProperties(\n            this.handle,\n            mass,\n            rawCom,\n            rawPrincipalInertia,\n            rawInertiaFrame,\n        );\n\n        rawCom.free();\n        rawPrincipalInertia.free();\n        rawInertiaFrame.free();\n    }\n\n    // #endif\n\n\n    /**\n     * Sets the translation of this collider.\n     *\n     * @param tra - The world-space position of the collider.\n     */\n    public setTranslation(tra: Vector) {\n        // #if DIM3\n        this.colliderSet.raw.coSetTranslation(this.handle, tra.x, tra.y, tra.z);\n        // #endif\n    }\n\n    /**\n     * Sets the translation of this collider relative to its parent rigid-body.\n     *\n     * Does nothing if this collider isn't attached to a rigid-body.\n     *\n     * @param tra - The new translation of the collider relative to its parent.\n     */\n    public setTranslationWrtParent(tra: Vector) {\n        // #if DIM3\n        this.colliderSet.raw.coSetTranslationWrtParent(\n            this.handle,\n            tra.x,\n            tra.y,\n            tra.z,\n        );\n        // #endif\n    }\n\n    // #if DIM3\n    /**\n     * Sets the rotation quaternion of this collider.\n     *\n     * This does nothing if a zero quaternion is provided.\n     *\n     * @param rotation - The rotation to set.\n     */\n    public setRotation(rot: Rotation) {\n        this.colliderSet.raw.coSetRotation(\n            this.handle,\n            rot.x,\n            rot.y,\n            rot.z,\n            rot.w,\n        );\n    }\n\n    /**\n     * Sets the rotation quaternion of this collider relative to its parent rigid-body.\n     *\n     * This does nothing if a zero quaternion is provided or if this collider isn't\n     * attached to a rigid-body.\n     *\n     * @param rotation - The rotation to set.\n     */\n    public setRotationWrtParent(rot: Rotation) {\n        this.colliderSet.raw.coSetRotationWrtParent(\n            this.handle,\n            rot.x,\n            rot.y,\n            rot.z,\n            rot.w,\n        );\n    }\n\n    // #endif\n\n    /**\n     * The type of the shape of this collider.\n     */\n    public shapeType(): ShapeType {\n        return this.colliderSet.raw.coShapeType(\n            this.handle,\n        ) as number as ShapeType;\n    }\n\n    /**\n     * The half-extents of this collider if it is a cuboid shape.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public halfExtents(target?: Vector): Vector | null {\n        const isCuboid = this.colliderSet.raw.coHalfExtents(\n            this.handle,\n            scratchBuffer,\n        );\n        return isCuboid ? VectorOps.fromBuffer(scratchBuffer, target) : null;\n    }\n\n    /**\n     * Sets the half-extents of this collider if it is a cuboid shape.\n     *\n     * @param newHalfExtents - desired half extents.\n     */\n    public setHalfExtents(newHalfExtents: Vector) {\n        const rawPoint = VectorOps.intoRaw(newHalfExtents);\n        this.colliderSet.raw.coSetHalfExtents(this.handle, rawPoint);\n    }\n\n    /**\n     * The radius of this collider if it is a ball, cylinder, capsule, or cone shape.\n     */\n    public radius(): number {\n        return this.colliderSet.raw.coRadius(this.handle);\n    }\n\n    /**\n     * Sets the radius of this collider if it is a ball, cylinder, capsule, or cone shape.\n     *\n     * @param newRadius - desired radius.\n     */\n    public setRadius(newRadius: number): void {\n        this.colliderSet.raw.coSetRadius(this.handle, newRadius);\n    }\n\n    /**\n     * The radius of the round edges of this collider if it is a round cylinder.\n     */\n    public roundRadius(): number {\n        return this.colliderSet.raw.coRoundRadius(this.handle);\n    }\n\n    /**\n     * Sets the radius of the round edges of this collider if it has round edges.\n     *\n     * @param newBorderRadius - desired round edge radius.\n     */\n    public setRoundRadius(newBorderRadius: number) {\n        this.colliderSet.raw.coSetRoundRadius(this.handle, newBorderRadius);\n    }\n\n    /**\n     * The half height of this collider if it is a cylinder, capsule, or cone shape.\n     */\n    public halfHeight(): number {\n        return this.colliderSet.raw.coHalfHeight(this.handle);\n    }\n\n    /**\n     * Sets the half height of this collider if it is a cylinder, capsule, or cone shape.\n     *\n     * @param newHalfheight - desired half height.\n     */\n    public setHalfHeight(newHalfheight: number) {\n        this.colliderSet.raw.coSetHalfHeight(this.handle, newHalfheight);\n    }\n\n    /**\n     * If this collider has a Voxels shape, this will mark the voxel at the\n     * given grid coordinates as filled or empty (depending on the `filled`\n     * argument).\n     *\n     * Each input value is assumed to be an integer.\n     *\n     * The operation is O(1), unless the provided coordinates are out of the\n     * bounds of the currently allocated internal grid in which case the grid\n     * will be grown automatically.\n     */\n    public setVoxel(\n        ix: number,\n        iy: number,\n        // #if DIM3\n        iz: number,\n        // #endif\n        filled: boolean,\n    ) {\n        this.colliderSet.raw.coSetVoxel(\n            this.handle,\n            ix,\n            iy,\n            // #if DIM3\n            iz,\n            // #endif\n            filled,\n        );\n        // We modified the shape, invalidate it to keep our cache\n        // up-to-date the next time the user requests the shape data.\n        // PERF: this isn’t ideal for performances as this adds a\n        //       hidden, non-constant, cost.\n        this._shape = null;\n    }\n\n    /**\n     * If this and `voxels2` are voxel colliders, and a voxel from `this` was\n     * modified with `setVoxel`, this will ensure that a\n     * moving object transitioning across the boundaries of these colliders\n     * won’t suffer from the \"internal edges\" artifact.\n     *\n     * The indices `ix, iy, iz` indicate the integer coordinates of the voxel in\n     * the local coordinate frame of `this`.\n     *\n     * If the voxels in `voxels2` live in a different coordinate space from `this`,\n     * then the `shift_*` argument indicate the distance, in voxel units, between\n     * the origin of `this` to the origin of `voxels2`.\n     *\n     * This method is intended to be called between `this` and all the other\n     * voxels colliders with a domain intersecting `this` or sharing a domain\n     * boundary. This is an incremental maintenance of the effect of\n     * `combineVoxelStates`.\n     */\n    public propagateVoxelChange(\n        voxels2: Collider,\n        ix: number,\n        iy: number,\n        // #if DIM3\n        iz: number,\n        // #endif\n        shift_x: number,\n        shift_y: number,\n        // #if DIM3\n        shift_z: number,\n        // #endif\n    ) {\n        this.colliderSet.raw.coPropagateVoxelChange(\n            this.handle,\n            voxels2.handle,\n            ix,\n            iy,\n            // #if DIM3\n            iz,\n            // #endif\n            shift_x,\n            shift_y,\n            // #if DIM3\n            shift_z,\n            // #endif\n        );\n        // We modified the shape, invalidate it to keep our cache\n        // up-to-date the next time the user requests the shape data.\n        // PERF: this isn’t ideal for performances as this adds a\n        //       hidden, non-constant, cost.\n        this._shape = null;\n    }\n\n    /**\n     * If this and `voxels2` are voxel colliders, this will ensure that a\n     * moving object transitioning across the boundaries of these colliders\n     * won’t suffer from the \"internal edges\" artifact.\n     *\n     * If the voxels in `voxels2` live in a different coordinate space from `this`,\n     * then the `shift_*` argument indicate the distance, in voxel units, between\n     * the origin of `this` to the origin of `voxels2`.\n     *\n     * This method is intended to be called once between all pairs of voxels\n     * colliders with intersecting domains or shared boundaries.\n     *\n     * If either voxels collider is then modified with `setVoxel`, the\n     * `propagateVoxelChange` method must be called to maintain the coupling\n     * between the voxels shapes after the modification.\n     */\n    public combineVoxelStates(\n        voxels2: Collider,\n        shift_x: number,\n        shift_y: number,\n        // #if DIM3\n        shift_z: number,\n        // #endif\n    ) {\n        this.colliderSet.raw.coCombineVoxelStates(\n            this.handle,\n            voxels2.handle,\n            shift_x,\n            shift_y,\n            // #if DIM3\n            shift_z,\n            // #endif\n        );\n        // We modified the shape, invalidate it to keep our cache\n        // up-to-date the next time the user requests the shape data.\n        // PERF: this isn’t ideal for performances as this adds a\n        //       hidden, non-constant, cost.\n        this._shape = null;\n    }\n\n    /**\n     * If this collider has a triangle mesh, polyline, convex polygon, or convex polyhedron shape,\n     * this returns the vertex buffer of said shape.\n     */\n    public vertices(): Float32Array {\n        return this.colliderSet.raw.coVertices(this.handle);\n    }\n\n    /**\n     * If this collider has a triangle mesh, polyline, or convex polyhedron shape,\n     * this returns the index buffer of said shape.\n     */\n    public indices(): Uint32Array | undefined {\n        return this.colliderSet.raw.coIndices(this.handle);\n    }\n\n    /**\n     * If this collider has a heightfield shape, this returns the heights buffer of\n     * the heightfield.\n     * In 3D, the returned height matrix is provided in column-major order.\n     */\n    public heightfieldHeights(): Float32Array {\n        return this.colliderSet.raw.coHeightfieldHeights(this.handle);\n    }\n\n    /**\n     * If this collider has a heightfield shape, this returns the scale\n     * applied to it.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public heightfieldScale(target?: Vector): Vector | null {\n        const isHeightfield = this.colliderSet.raw.coHeightfieldScale(\n            this.handle,\n            scratchBuffer,\n        );\n        return isHeightfield\n            ? VectorOps.fromBuffer(scratchBuffer, target)\n            : null;\n    }\n\n    // #if DIM3\n    /**\n     * If this collider has a heightfield shape, this returns the number of\n     * rows of its height matrix.\n     */\n    public heightfieldNRows(): number {\n        return this.colliderSet.raw.coHeightfieldNRows(this.handle);\n    }\n\n    /**\n     * If this collider has a heightfield shape, this returns the number of\n     * columns of its height matrix.\n     */\n    public heightfieldNCols(): number {\n        return this.colliderSet.raw.coHeightfieldNCols(this.handle);\n    }\n\n    // #endif\n\n    /**\n     * The rigid-body this collider is attached to.\n     */\n    public parent(): RigidBody | null {\n        return this._parent;\n    }\n\n    /**\n     * The handle of the soft body whose deformable collision mesh this collider holds, if\n     * any.\n     */\n    public softBody(): number | null {\n        let handle = this.colliderSet.raw.coSoftBody(this.handle);\n        return handle === undefined ? null : handle;\n    }\n\n    /**\n     * Does this collider hold a soft body's deformable collision mesh? Its vertices then\n     * follow the soft body's particles: read them back with `SoftBody.meshVertices`.\n     */\n    public isDeformable(): boolean {\n        return this.colliderSet.raw.coIsDeformable(this.handle);\n    }\n\n    /**\n     * The friction coefficient of this collider.\n     */\n    public friction(): number {\n        return this.colliderSet.raw.coFriction(this.handle);\n    }\n\n    /**\n     * The restitution coefficient of this collider.\n     */\n    public restitution(): number {\n        return this.colliderSet.raw.coRestitution(this.handle);\n    }\n\n    /**\n     * The density of this collider.\n     */\n    public density(): number {\n        return this.colliderSet.raw.coDensity(this.handle);\n    }\n\n    /**\n     * The mass of this collider.\n     */\n    public mass(): number {\n        return this.colliderSet.raw.coMass(this.handle);\n    }\n\n    /**\n     * The volume of this collider.\n     */\n    public volume(): number {\n        return this.colliderSet.raw.coVolume(this.handle);\n    }\n\n    /**\n     * The collision groups of this collider.\n     */\n    public collisionGroups(): InteractionGroups {\n        return this.colliderSet.raw.coCollisionGroups(this.handle);\n    }\n\n    /**\n     * The solver groups of this collider.\n     */\n    public solverGroups(): InteractionGroups {\n        return this.colliderSet.raw.coSolverGroups(this.handle);\n    }\n\n    /**\n     * Tests if this collider contains a point.\n     *\n     * @param point - The point to test.\n     */\n    public containsPoint(point: Vector): boolean {\n        let rawPoint = VectorOps.intoRaw(point);\n        let result = this.colliderSet.raw.coContainsPoint(\n            this.handle,\n            rawPoint,\n        );\n\n        rawPoint.free();\n\n        return result;\n    }\n\n    /**\n     * Find the projection of a point on this collider.\n     *\n     * @param point - The point to project.\n     * @param solid - If this is set to `true` then the collider shapes are considered to\n     *   be plain (if the point is located inside of a plain shape, its projection is the point\n     *   itself). If it is set to `false` the collider shapes are considered to be hollow\n     *   (if the point is located inside of an hollow shape, it is projected on the shape's\n     *   boundary).\n     */\n    public projectPoint(\n        point: Vector,\n        solid: boolean,\n        target?: PointProjection,\n    ): PointProjection | null {\n        let rawPoint = VectorOps.intoRaw(point);\n        let result = PointProjection.fromBuffer(\n            this.colliderSet.raw.coProjectPoint(this.handle, rawPoint, solid),\n            target,\n        );\n\n        rawPoint.free();\n\n        return result;\n    }\n\n    /**\n     * Tests if this collider intersects the given ray.\n     *\n     * @param ray - The ray to cast.\n     * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively\n     *   limits the length of the ray to `ray.dir.norm() * maxToi`.\n     */\n    public intersectsRay(ray: Ray, maxToi: number): boolean {\n        let rawOrig = VectorOps.intoRaw(ray.origin);\n        let rawDir = VectorOps.intoRaw(ray.dir);\n        let result = this.colliderSet.raw.coIntersectsRay(\n            this.handle,\n            rawOrig,\n            rawDir,\n            maxToi,\n        );\n\n        rawOrig.free();\n        rawDir.free();\n\n        return result;\n    }\n\n    /**\n     * Computes the smallest time between this and the given shape under translational movement are separated by a distance smaller or equal to distance.\n     *\n     * In the returned hit, `witness1` and `normal1` lie on this collider and are expressed in its\n     * local-space, while `witness2` and `normal2` lie on `shape2` and are expressed in its\n     * local-space (relative to `shape2Pos` and `shape2Rot`).\n     *\n     * @param collider1Vel - The constant velocity of the current shape to cast (i.e. the cast direction).\n     * @param shape2 - The shape to cast against.\n     * @param shape2Pos - The position of the second shape.\n     * @param shape2Rot - The rotation of the second shape.\n     * @param shape2Vel - The constant velocity of the second shape.\n     * @param targetDistance − If the shape moves closer to this distance from a collider, a hit\n     *                         will be returned.\n     * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively\n     *   limits the distance traveled by the shape to `collider1Vel.norm() * maxToi`.\n     * @param stopAtPenetration - If set to `false`, the linear shape-cast won’t immediately stop if\n     *   the shape is penetrating another shape at its starting point **and** its trajectory is such\n     *   that it’s on a path to exit that penetration state.\n     * @param {ShapeCastHit?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public castShape(\n        collider1Vel: Vector,\n        shape2: Shape,\n        shape2Pos: Vector,\n        shape2Rot: Rotation,\n        shape2Vel: Vector,\n        targetDistance: number,\n        maxToi: number,\n        stopAtPenetration: boolean,\n        target?: ShapeCastHit,\n    ): ShapeCastHit | null {\n        let rawCollider1Vel = VectorOps.intoRaw(collider1Vel);\n        let rawShape2Pos = VectorOps.intoRaw(shape2Pos);\n        let rawShape2Rot = RotationOps.intoRaw(shape2Rot);\n        let rawShape2Vel = VectorOps.intoRaw(shape2Vel);\n        let rawShape2 = shape2.intoRaw();\n\n        const rawShapeCastHit = this.colliderSet.raw.coCastShape(\n            this.handle,\n            rawCollider1Vel,\n            rawShape2,\n            rawShape2Pos,\n            rawShape2Rot,\n            rawShape2Vel,\n            targetDistance,\n            maxToi,\n            stopAtPenetration,\n        );\n\n        let result = null;\n        if (rawShapeCastHit) {\n            rawShapeCastHit.getComponents(scratchBuffer);\n            result = ShapeCastHit.fromBuffer(null, scratchBuffer, target);\n            rawShapeCastHit.free();\n        }\n\n        rawCollider1Vel.free();\n        rawShape2Pos.free();\n        rawShape2Rot.free();\n        rawShape2Vel.free();\n        rawShape2.free();\n\n        return result;\n    }\n\n    /**\n     * Computes the smallest time between this and the given collider under translational movement are separated by a distance smaller or equal to distance.\n     *\n     * In the returned hit, `collider` is `collider2`; `witness1` and `normal1` lie on this collider\n     * and are expressed in its local-space, while `witness2` and `normal2` lie on `collider2` and\n     * are expressed in its local-space.\n     *\n     * @param collider1Vel - The constant velocity of the current collider to cast (i.e. the cast direction).\n     * @param collider2 - The collider to cast against.\n     * @param collider2Vel - The constant velocity of the second collider.\n     * @param targetDistance − If the shape moves closer to this distance from a collider, a hit\n     *                         will be returned.\n     * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively\n     *   limits the distance traveled by the shape to `shapeVel.norm() * maxToi`.\n     * @param stopAtPenetration - If set to `false`, the linear shape-cast won’t immediately stop if\n     *   the shape is penetrating another shape at its starting point **and** its trajectory is such\n     *   that it’s on a path to exit that penetration state.\n     * @param {ColliderShapeCastHit?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public castCollider(\n        collider1Vel: Vector,\n        collider2: Collider,\n        collider2Vel: Vector,\n        targetDistance: number,\n        maxToi: number,\n        stopAtPenetration: boolean,\n        target?: ColliderShapeCastHit,\n    ): ColliderShapeCastHit | null {\n        let rawCollider1Vel = VectorOps.intoRaw(collider1Vel);\n        let rawCollider2Vel = VectorOps.intoRaw(collider2Vel);\n\n        const rawColliderShapeCastHit = this.colliderSet.raw.coCastCollider(\n            this.handle,\n            rawCollider1Vel,\n            collider2.handle,\n            rawCollider2Vel,\n            targetDistance,\n            maxToi,\n            stopAtPenetration,\n        );\n\n        let result = null;\n        if (rawColliderShapeCastHit) {\n            const colliderHandle: number =\n                rawColliderShapeCastHit.colliderHandle();\n            rawColliderShapeCastHit.getComponents(scratchBuffer);\n            result = ColliderShapeCastHit.fromBuffer(\n                this.colliderSet.get(colliderHandle),\n                scratchBuffer,\n                target,\n            );\n            rawColliderShapeCastHit.free();\n        }\n\n        rawCollider1Vel.free();\n        rawCollider2Vel.free();\n\n        return result;\n    }\n\n    public intersectsShape(\n        shape2: Shape,\n        shapePos2: Vector,\n        shapeRot2: Rotation,\n    ): boolean {\n        let rawPos2 = VectorOps.intoRaw(shapePos2);\n        let rawRot2 = RotationOps.intoRaw(shapeRot2);\n        let rawShape2 = shape2.intoRaw();\n\n        let result = this.colliderSet.raw.coIntersectsShape(\n            this.handle,\n            rawShape2,\n            rawPos2,\n            rawRot2,\n        );\n\n        rawPos2.free();\n        rawRot2.free();\n        rawShape2.free();\n\n        return result;\n    }\n\n    /**\n     * Computes one pair of contact points between the shape owned by this collider and the given shape.\n     *\n     * @param shape2 - The second shape.\n     * @param shape2Pos - The initial position of the second shape.\n     * @param shape2Rot - The rotation of the second shape.\n     * @param prediction - The prediction value, if the shapes are separated by a distance greater than this value, test will fail.\n     * @returns `null` if the shapes are separated by a distance greater than prediction, otherwise contact details. The result is given in world-space.\n     */\n    contactShape(\n        shape2: Shape,\n        shape2Pos: Vector,\n        shape2Rot: Rotation,\n        prediction: number,\n        target?: ShapeContact,\n    ): ShapeContact | null {\n        let rawPos2 = VectorOps.intoRaw(shape2Pos);\n        let rawRot2 = RotationOps.intoRaw(shape2Rot);\n        let rawShape2 = shape2.intoRaw();\n\n        let result = ShapeContact.fromBuffer(\n            this.colliderSet.raw.coContactShape(\n                this.handle,\n                rawShape2,\n                rawPos2,\n                rawRot2,\n                prediction,\n            ),\n            target,\n        );\n\n        rawPos2.free();\n        rawRot2.free();\n        rawShape2.free();\n\n        return result;\n    }\n\n    /**\n     * Computes one pair of contact points between the collider and the given collider.\n     *\n     * @param collider2 - The second collider.\n     * @param prediction - The prediction value, if the shapes are separated by a distance greater than this value, test will fail.\n     * @returns `null` if the shapes are separated by a distance greater than prediction, otherwise contact details. The result is given in world-space.\n     */\n    contactCollider(\n        collider2: Collider,\n        prediction: number,\n        target?: ShapeContact,\n    ): ShapeContact | null {\n        let result = ShapeContact.fromBuffer(\n            this.colliderSet.raw.coContactCollider(\n                this.handle,\n                collider2.handle,\n                prediction,\n            ),\n            target,\n        );\n\n        return result;\n    }\n\n    /**\n     * Find the closest intersection between a ray and this collider.\n     *\n     * This also computes the normal at the hit point.\n     * @param ray - The ray to cast.\n     * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively\n     *   limits the length of the ray to `ray.dir.norm() * maxToi`.\n     * @param solid - If `false` then the ray will attempt to hit the boundary of a shape, even if its\n     *   origin already lies inside of a shape. In other terms, `true` implies that all shapes are plain,\n     *   whereas `false` implies that all shapes are hollow for this ray-cast.\n     * @returns The time-of-impact between this collider and the ray, or `-1` if there is no intersection.\n     */\n    public castRay(ray: Ray, maxToi: number, solid: boolean): number {\n        let rawOrig = VectorOps.intoRaw(ray.origin);\n        let rawDir = VectorOps.intoRaw(ray.dir);\n        let result = this.colliderSet.raw.coCastRay(\n            this.handle,\n            rawOrig,\n            rawDir,\n            maxToi,\n            solid,\n        );\n\n        rawOrig.free();\n        rawDir.free();\n\n        return result;\n    }\n\n    /**\n     * Find the closest intersection between a ray and this collider.\n     *\n     * This also computes the normal at the hit point.\n     * @param ray - The ray to cast.\n     * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively\n     *   limits the length of the ray to `ray.dir.norm() * maxToi`.\n     * @param solid - If `false` then the ray will attempt to hit the boundary of a shape, even if its\n     *   origin already lies inside of a shape. In other terms, `true` implies that all shapes are plain,\n     *   whereas `false` implies that all shapes are hollow for this ray-cast.\n     */\n    public castRayAndGetNormal(\n        ray: Ray,\n        maxToi: number,\n        solid: boolean,\n        target?: RayIntersection,\n    ): RayIntersection | null {\n        let rawOrig = VectorOps.intoRaw(ray.origin);\n        let rawDir = VectorOps.intoRaw(ray.dir);\n        let result = RayIntersection.fromBuffer(\n            this.colliderSet.raw.coCastRayAndGetNormal(\n                this.handle,\n                rawOrig,\n                rawDir,\n                maxToi,\n                solid,\n            ),\n            target,\n        );\n\n        rawOrig.free();\n        rawDir.free();\n\n        return result;\n    }\n}\n\nexport enum MassPropsMode {\n    Density,\n    Mass,\n    MassProps,\n}\n\nexport class ColliderDesc {\n    enabled: boolean;\n    shape: Shape;\n    massPropsMode: MassPropsMode;\n    mass: number;\n    centerOfMass: Vector;\n    // #if DIM3\n    principalAngularInertia: Vector;\n    angularInertiaLocalFrame: Rotation;\n    // #endif\n    density: number;\n    friction: number;\n    restitution: number;\n    rotation: Rotation;\n    translation: Vector;\n    isSensor: boolean;\n    collisionGroups: InteractionGroups;\n    solverGroups: InteractionGroups;\n    frictionCombineRule: CoefficientCombineRule;\n    restitutionCombineRule: CoefficientCombineRule;\n    activeEvents: ActiveEvents;\n    activeHooks: ActiveHooks;\n    activeCollisionTypes: ActiveCollisionTypes;\n    contactForceEventThreshold: number;\n    contactSkin: number;\n\n    /**\n     * Initializes a collider descriptor from the collision shape.\n     *\n     * @param shape - The shape of the collider being built.\n     */\n    constructor(shape: Shape) {\n        this.enabled = true;\n        this.shape = shape;\n        this.massPropsMode = MassPropsMode.Density;\n        this.density = 1.0;\n        this.friction = 0.5;\n        this.restitution = 0.0;\n        this.rotation = RotationOps.identity();\n        this.translation = VectorOps.zeros();\n        this.isSensor = false;\n        this.collisionGroups = 0xffff_ffff;\n        this.solverGroups = 0xffff_ffff;\n        this.frictionCombineRule = CoefficientCombineRule.Average;\n        this.restitutionCombineRule = CoefficientCombineRule.Average;\n        this.activeCollisionTypes = ActiveCollisionTypes.DEFAULT;\n        this.activeEvents = ActiveEvents.NONE;\n        this.activeHooks = ActiveHooks.NONE;\n        this.mass = 0.0;\n        this.centerOfMass = VectorOps.zeros();\n        this.contactForceEventThreshold = 0.0;\n        this.contactSkin = 0.0;\n\n        // #if DIM3\n        this.principalAngularInertia = VectorOps.zeros();\n        this.angularInertiaLocalFrame = RotationOps.identity();\n        // #endif\n    }\n\n    /**\n     * Create a new collider descriptor with a ball shape.\n     *\n     * @param radius - The radius of the ball.\n     */\n    public static ball(radius: number): ColliderDesc {\n        const shape = new Ball(radius);\n        return new ColliderDesc(shape);\n    }\n\n    /**\n     * Create a new collider descriptor with a capsule shape.\n     *\n     * @param halfHeight - The half-height of the capsule, along the `y` axis.\n     * @param radius - The radius of the capsule basis.\n     */\n    public static capsule(halfHeight: number, radius: number): ColliderDesc {\n        const shape = new Capsule(halfHeight, radius);\n        return new ColliderDesc(shape);\n    }\n\n    /**\n     * Creates a new segment shape.\n     *\n     * @param a - The first point of the segment.\n     * @param b - The second point of the segment.\n     */\n    public static segment(a: Vector, b: Vector): ColliderDesc {\n        const shape = new Segment(a, b);\n        return new ColliderDesc(shape);\n    }\n\n    /**\n     * Creates a new triangle shape.\n     *\n     * @param a - The first point of the triangle.\n     * @param b - The second point of the triangle.\n     * @param c - The third point of the triangle.\n     */\n    public static triangle(a: Vector, b: Vector, c: Vector): ColliderDesc {\n        const shape = new Triangle(a, b, c);\n        return new ColliderDesc(shape);\n    }\n\n    /**\n     * Creates a new triangle shape with round corners.\n     *\n     * @param a - The first point of the triangle.\n     * @param b - The second point of the triangle.\n     * @param c - The third point of the triangle.\n     * @param borderRadius - The radius of the borders of this triangle. In 3D,\n     *   this is also equal to half the thickness of the triangle.\n     */\n    public static roundTriangle(\n        a: Vector,\n        b: Vector,\n        c: Vector,\n        borderRadius: number,\n    ): ColliderDesc {\n        const shape = new RoundTriangle(a, b, c, borderRadius);\n        return new ColliderDesc(shape);\n    }\n\n    /**\n     * Creates a new collider descriptor with a polyline shape.\n     *\n     * @param vertices - The coordinates of the polyline's vertices.\n     * @param indices - The indices of the polyline's segments. If this is `undefined` or `null`,\n     *    the vertices are assumed to describe a line strip.\n     */\n    public static polyline(\n        vertices: Float32Array,\n        indices?: Uint32Array | null,\n        flags?: PolylineFlags,\n    ): ColliderDesc {\n        const shape = new Polyline(vertices, indices, flags);\n        return new ColliderDesc(shape);\n    }\n\n    /**\n     * Creates a new collider descriptor with a shape made of voxels.\n     *\n     * @param data - Defines the set of voxels. If this is a `Int32Array` then\n     *               each voxel is defined from its (signed) grid coordinates,\n     *               with 3 (resp 2) contiguous integers per voxel in 3D (resp 2D).\n     *               If this is a `Float32Array`, each voxel will be such that\n     *               they contain at least one point from this array (where each\n     *               point is defined from 3 (resp 2) contiguous numbers per point\n     *               in 3D (resp 2D).\n     * @param voxelSize - The size of each voxel.\n     */\n    public static voxels(\n        voxels: Float32Array | Int32Array,\n        voxelSize: Vector,\n    ): ColliderDesc {\n        const shape = new Voxels(voxels, voxelSize);\n        return new ColliderDesc(shape);\n    }\n\n    /**\n     * Creates a new collider descriptor with a triangle mesh shape.\n     *\n     * @param vertices - The coordinates of the triangle mesh's vertices.\n     * @param indices - The indices of the triangle mesh's triangles.\n     */\n    public static trimesh(\n        vertices: Float32Array,\n        indices: Uint32Array,\n        flags?: TriMeshFlags,\n    ): ColliderDesc {\n        const shape = new TriMesh(vertices, indices, flags);\n        return new ColliderDesc(shape);\n    }\n\n\n    // #if DIM3\n    /**\n     * Creates a new collider descriptor with a cuboid shape.\n     *\n     * @param hx - The half-width of the rectangle along its local `x` axis.\n     * @param hy - The half-width of the rectangle along its local `y` axis.\n     * @param hz - The half-width of the rectangle along its local `z` axis.\n     */\n    public static cuboid(hx: number, hy: number, hz: number): ColliderDesc {\n        const shape = new Cuboid(hx, hy, hz);\n        return new ColliderDesc(shape);\n    }\n\n    /**\n     * Creates a new collider descriptor with a rectangular shape with round borders.\n     *\n     * @param hx - The half-width of the rectangle along its local `x` axis.\n     * @param hy - The half-width of the rectangle along its local `y` axis.\n     * @param hz - The half-width of the rectangle along its local `z` axis.\n     * @param borderRadius - The radius of the cuboid's borders.\n     */\n    public static roundCuboid(\n        hx: number,\n        hy: number,\n        hz: number,\n        borderRadius: number,\n    ): ColliderDesc {\n        const shape = new RoundCuboid(hx, hy, hz, borderRadius);\n        return new ColliderDesc(shape);\n    }\n\n    /**\n     * Creates a new collider descriptor with a heightfield shape.\n     *\n     * @param nrows − The number of rows in the heights matrix.\n     * @param ncols - The number of columns in the heights matrix.\n     * @param heights - The heights of the heightfield along its local `y` axis,\n     *                  provided as a matrix stored in column-major order.\n     * @param scale - The scale factor applied to the heightfield.\n     */\n    public static heightfield(\n        nrows: number,\n        ncols: number,\n        heights: Float32Array,\n        scale: Vector,\n        flags?: HeightFieldFlags,\n    ): ColliderDesc {\n        const shape = new Heightfield(nrows, ncols, heights, scale, flags);\n        return new ColliderDesc(shape);\n    }\n\n    /**\n     * Create a new collider descriptor with a cylinder shape.\n     *\n     * @param halfHeight - The half-height of the cylinder, along the `y` axis.\n     * @param radius - The radius of the cylinder basis.\n     */\n    public static cylinder(halfHeight: number, radius: number): ColliderDesc {\n        const shape = new Cylinder(halfHeight, radius);\n        return new ColliderDesc(shape);\n    }\n\n    /**\n     * Create a new collider descriptor with a cylinder shape with rounded corners.\n     *\n     * @param halfHeight - The half-height of the cylinder, along the `y` axis.\n     * @param radius - The radius of the cylinder basis.\n     * @param borderRadius - The radius of the cylinder's rounded edges and vertices.\n     */\n    public static roundCylinder(\n        halfHeight: number,\n        radius: number,\n        borderRadius: number,\n    ): ColliderDesc {\n        const shape = new RoundCylinder(halfHeight, radius, borderRadius);\n        return new ColliderDesc(shape);\n    }\n\n    /**\n     * Create a new collider descriptor with a cone shape.\n     *\n     * @param halfHeight - The half-height of the cone, along the `y` axis.\n     * @param radius - The radius of the cone basis.\n     */\n    public static cone(halfHeight: number, radius: number): ColliderDesc {\n        const shape = new Cone(halfHeight, radius);\n        return new ColliderDesc(shape);\n    }\n\n    /**\n     * Create a new collider descriptor with a cone shape with rounded corners.\n     *\n     * @param halfHeight - The half-height of the cone, along the `y` axis.\n     * @param radius - The radius of the cone basis.\n     * @param borderRadius - The radius of the cone's rounded edges and vertices.\n     */\n    public static roundCone(\n        halfHeight: number,\n        radius: number,\n        borderRadius: number,\n    ): ColliderDesc {\n        const shape = new RoundCone(halfHeight, radius, borderRadius);\n        return new ColliderDesc(shape);\n    }\n\n    /**\n     * Computes the convex-hull of the given points and use the resulting\n     * convex polyhedron as the shape for this new collider descriptor.\n     *\n     * @param points - The point that will be used to compute the convex-hull.\n     */\n    public static convexHull(points: Float32Array): ColliderDesc | null {\n        const shape = new ConvexPolyhedron(points, null);\n        return new ColliderDesc(shape);\n    }\n\n    /**\n     * Creates a new collider descriptor that uses the given set of points assumed\n     * to form a convex polyline (no convex-hull computation will be done).\n     *\n     * @param vertices - The vertices of the convex polyline.\n     */\n    public static convexMesh(\n        vertices: Float32Array,\n        indices?: Uint32Array | null,\n    ): ColliderDesc | null {\n        const shape = new ConvexPolyhedron(vertices, indices);\n        return new ColliderDesc(shape);\n    }\n\n    /**\n     * Computes the convex-hull of the given points and use the resulting\n     * convex polyhedron as the shape for this new collider descriptor. A\n     * border is added to that convex polyhedron to give it round corners.\n     *\n     * @param points - The point that will be used to compute the convex-hull.\n     * @param borderRadius - The radius of the round border added to the convex polyhedron.\n     */\n    public static roundConvexHull(\n        points: Float32Array,\n        borderRadius: number,\n    ): ColliderDesc | null {\n        const shape = new RoundConvexPolyhedron(points, null, borderRadius);\n        return new ColliderDesc(shape);\n    }\n\n    /**\n     * Creates a new collider descriptor that uses the given set of points assumed\n     * to form a round convex polyline (no convex-hull computation will be done).\n     *\n     * @param vertices - The vertices of the convex polyline.\n     * @param borderRadius - The radius of the round border added to the convex polyline.\n     */\n    public static roundConvexMesh(\n        vertices: Float32Array,\n        indices: Uint32Array | null,\n        borderRadius: number,\n    ): ColliderDesc | null {\n        const shape = new RoundConvexPolyhedron(\n            vertices,\n            indices,\n            borderRadius,\n        );\n        return new ColliderDesc(shape);\n    }\n\n    // #endif\n\n    /**\n     * Creates a new collider descriptor with a compound shape.\n     *\n     * @param shapes - The array of shapes composing this compound. Must not be empty, and\n     *                 must not contain other compound shapes (nested compound shapes are\n     *                 not allowed).\n     * @param positions - The array of positions for each shape (relative to the compound's origin).\n     * @param rotations - The array of rotations for each shape (relative to the compound's orientation).\n     * @param flags - The compound flags.\n     */\n    public static compound(\n        shapes: Shape[],\n        positions: Vector[],\n        rotations: Rotation[],\n        flags?: CompoundFlags,\n    ): ColliderDesc {\n        const shape = new Compound(shapes, positions, rotations, flags);\n        return new ColliderDesc(shape);\n    }\n\n    /**\n     * Creates a new collider descriptor with a compound shape automatically created\n     * from a convex decomposition of the given triangle mesh (in 3D) or polyline (in 2D).\n     *\n     * @param vertices - The coordinates of the mesh's vertices.\n     * @param indices - The indices of the mesh's triangles (in 3D) or segments (in 2D).\n     * @param params - Optional VHACD parameters to control the decomposition.\n     * @param flags - The flags of the resulting compound shape.\n     * @returns The collider descriptor, or `null` if the decomposition did not produce\n     *          any convex part (e.g. if the input mesh is degenerate).\n     */\n    public static convexDecomposition(\n        vertices: Float32Array,\n        indices: Uint32Array,\n        params?: VHACDParameters,\n        flags?: CompoundFlags,\n    ): ColliderDesc | null {\n        let rawShape: RawShape;\n        const rawFlags = flags ?? 0;\n\n        if (params) {\n            // Convert TypeScript params to Rust params\n            const rawParams = new RawVHACDParameters();\n            if (params.alpha !== undefined) rawParams.alpha = params.alpha;\n            if (params.beta !== undefined) rawParams.beta = params.beta;\n            if (params.concavity !== undefined)\n                rawParams.concavity = params.concavity;\n            if (params.planeDownsampling !== undefined)\n                rawParams.plane_downsampling = params.planeDownsampling;\n            if (params.convexHullDownsampling !== undefined)\n                rawParams.convex_hull_downsampling =\n                    params.convexHullDownsampling;\n            if (params.maxConvexHulls !== undefined)\n                rawParams.max_convex_hulls = params.maxConvexHulls;\n            if (params.resolution !== undefined)\n                rawParams.resolution = params.resolution;\n            if (params.convexHullApproximation !== undefined)\n                rawParams.convex_hull_approximation =\n                    params.convexHullApproximation;\n\n            rawShape = RawShape.convexDecompositionWithParams(\n                vertices,\n                indices,\n                rawParams,\n                rawFlags,\n            );\n            rawParams.free();\n        } else {\n            rawShape = RawShape.convexDecomposition(\n                vertices,\n                indices,\n                rawFlags,\n            );\n        }\n\n        if (!rawShape) {\n            return null;\n        }\n\n        const shape = Shape.fromRawShape(rawShape);\n        return new ColliderDesc(shape);\n    }\n\n\n    // #if DIM3\n    /**\n     * Sets the position of the collider to be created relative to the rigid-body it is attached to.\n     */\n    public setTranslation(x: number, y: number, z: number): ColliderDesc {\n        if (\n            typeof x != \"number\" ||\n            typeof y != \"number\" ||\n            typeof z != \"number\"\n        )\n            throw TypeError(\"The translation components must be numbers.\");\n\n        this.translation = {x: x, y: y, z: z};\n        return this;\n    }\n\n    // #endif\n\n    /**\n     * Sets the rotation of the collider to be created relative to the rigid-body it is attached to.\n     *\n     * @param rot - The rotation of the collider to be created relative to the rigid-body it is attached to.\n     */\n    public setRotation(rot: Rotation): ColliderDesc {\n        // #if DIM3\n        RotationOps.copy(this.rotation, rot);\n        // #endif\n        return this;\n    }\n\n    /**\n     * Sets whether or not the collider being created is a sensor.\n     *\n     * A sensor collider does not take part of the physics simulation, but generates\n     * proximity events.\n     *\n     * @param sensor - Set to `true` of the collider built is to be a sensor.\n     */\n    public setSensor(sensor: boolean): ColliderDesc {\n        this.isSensor = sensor;\n        return this;\n    }\n\n    /**\n     * Sets whether the created collider will be enabled or disabled.\n     * @param enabled − If set to `false` the collider will be disabled at creation.\n     */\n    public setEnabled(enabled: boolean): ColliderDesc {\n        this.enabled = enabled;\n        return this;\n    }\n\n    /**\n     * Sets the contact skin of the collider.\n     *\n     * The contact skin acts as if the collider was enlarged with a skin of width `skin_thickness`\n     * around it, keeping objects further apart when colliding.\n     *\n     * A non-zero contact skin can increase performance, and in some cases, stability. However\n     * it creates a small gap between colliding object (equal to the sum of their skin). If the\n     * skin is sufficiently small, this might not be visually significant or can be hidden by the\n     * rendering assets.\n     */\n    public setContactSkin(thickness: number): ColliderDesc {\n        this.contactSkin = thickness;\n        return this;\n    }\n\n    /**\n     * Sets the density of the collider being built.\n     *\n     * The mass and angular inertia tensor will be computed automatically based on this density and the collider’s shape.\n     *\n     * @param density - The density to set, must be greater or equal to 0. A density of 0 means that this collider\n     *                  will not affect the mass or angular inertia of the rigid-body it is attached to.\n     */\n    public setDensity(density: number): ColliderDesc {\n        this.massPropsMode = MassPropsMode.Density;\n        this.density = density;\n        return this;\n    }\n\n    /**\n     * Sets the mass of the collider being built.\n     *\n     * The angular inertia tensor will be computed automatically based on this mass and the collider’s shape.\n     *\n     * @param mass - The mass to set, must be greater or equal to 0.\n     */\n    public setMass(mass: number): ColliderDesc {\n        this.massPropsMode = MassPropsMode.Mass;\n        this.mass = mass;\n        return this;\n    }\n\n\n    // #if DIM3\n    /**\n     * Sets the mass properties of the collider being built.\n     *\n     * This replaces the mass-properties automatically computed from the collider's density and shape.\n     * These mass-properties will be added to the mass-properties of the rigid-body this collider will be attached to.\n     *\n     * @param mass − The mass of the collider to create.\n     * @param centerOfMass − The center-of-mass of the collider to create.\n     * @param principalAngularInertia − The initial principal angular inertia of the collider to create.\n     *                                  These are the eigenvalues of the angular inertia matrix.\n     * @param angularInertiaLocalFrame − The initial local angular inertia frame of the collider to create.\n     *                                   These are the eigenvectors of the angular inertia matrix.\n     */\n    public setMassProperties(\n        mass: number,\n        centerOfMass: Vector,\n        principalAngularInertia: Vector,\n        angularInertiaLocalFrame: Rotation,\n    ): ColliderDesc {\n        this.massPropsMode = MassPropsMode.MassProps;\n        this.mass = mass;\n        VectorOps.copy(this.centerOfMass, centerOfMass);\n        VectorOps.copy(this.principalAngularInertia, principalAngularInertia);\n        RotationOps.copy(\n            this.angularInertiaLocalFrame,\n            angularInertiaLocalFrame,\n        );\n        return this;\n    }\n\n    // #endif\n\n    /**\n     * Sets the restitution coefficient of the collider to be created.\n     *\n     * @param restitution - The restitution coefficient in `[0, 1]`. A value of 0 (the default) means no bouncing behavior\n     *                   while 1 means perfect bouncing (though energy may still be lost due to numerical errors of the\n     *                   constraints solver).\n     */\n    public setRestitution(restitution: number): ColliderDesc {\n        this.restitution = restitution;\n        return this;\n    }\n\n    /**\n     * Sets the friction coefficient of the collider to be created.\n     *\n     * @param friction - The friction coefficient. Must be greater or equal to 0. This is generally smaller than 1. The\n     *                   higher the coefficient, the stronger friction forces will be for contacts with the collider\n     *                   being built.\n     */\n    public setFriction(friction: number): ColliderDesc {\n        this.friction = friction;\n        return this;\n    }\n\n    /**\n     * Sets the rule used to combine the friction coefficients of two colliders\n     * colliders involved in a contact.\n     *\n     * @param rule − The combine rule to apply.\n     */\n    public setFrictionCombineRule(rule: CoefficientCombineRule): ColliderDesc {\n        this.frictionCombineRule = rule;\n        return this;\n    }\n\n    /**\n     * Sets the rule used to combine the restitution coefficients of two colliders\n     * colliders involved in a contact.\n     *\n     * @param rule − The combine rule to apply.\n     */\n    public setRestitutionCombineRule(\n        rule: CoefficientCombineRule,\n    ): ColliderDesc {\n        this.restitutionCombineRule = rule;\n        return this;\n    }\n\n    /**\n     * Sets the collision groups used by this collider.\n     *\n     * Two colliders will interact iff. their collision groups are compatible.\n     * See the documentation of `InteractionGroups` for details on the used bit pattern.\n     *\n     * @param groups - The collision groups used for the collider being built.\n     */\n    public setCollisionGroups(groups: InteractionGroups): ColliderDesc {\n        this.collisionGroups = groups;\n        return this;\n    }\n\n    /**\n     * Sets the solver groups used by this collider.\n     *\n     * Forces between two colliders in contact will be computed iff their solver\n     * groups are compatible.\n     * See the documentation of `InteractionGroups` for details on the used bit pattern.\n     *\n     * @param groups - The solver groups used for the collider being built.\n     */\n    public setSolverGroups(groups: InteractionGroups): ColliderDesc {\n        this.solverGroups = groups;\n        return this;\n    }\n\n    /**\n     * Set the physics hooks active for this collider.\n     *\n     * Use this to enable custom filtering rules for contact/intersecstion pairs involving this collider.\n     *\n     * @param activeHooks - The hooks active for contact/intersection pairs involving this collider.\n     */\n    public setActiveHooks(activeHooks: ActiveHooks): ColliderDesc {\n        this.activeHooks = activeHooks;\n        return this;\n    }\n\n    /**\n     * Set the events active for this collider.\n     *\n     * Use this to enable contact and/or intersection event reporting for this collider.\n     *\n     * @param activeEvents - The events active for contact/intersection pairs involving this collider.\n     */\n    public setActiveEvents(activeEvents: ActiveEvents): ColliderDesc {\n        this.activeEvents = activeEvents;\n        return this;\n    }\n\n    /**\n     * Set the collision types active for this collider.\n     *\n     * @param activeCollisionTypes - The hooks active for contact/intersection pairs involving this collider.\n     */\n    public setActiveCollisionTypes(\n        activeCollisionTypes: ActiveCollisionTypes,\n    ): ColliderDesc {\n        this.activeCollisionTypes = activeCollisionTypes;\n        return this;\n    }\n\n    /**\n     * Sets the total force magnitude beyond which a contact force event can be emitted.\n     *\n     * @param threshold - The force threshold to set.\n     */\n    public setContactForceEventThreshold(threshold: number): ColliderDesc {\n        this.contactForceEventThreshold = threshold;\n        return this;\n    }\n}\n","import {\n    RawSoftBodyBuilder,\n    RawSoftBodyMaterial,\n    RawSoftBodySet,\n    RawSoftBodySolver,\n    RawSoftBodyTearEvent,\n    RawSoftBodyCellModel,\n    RawSoftEdgePlasticFlow,\n    RawSoftMeshBindingMode,\n    RawSoftPatchConstraints,\n    RawSoftRecoverySettings,\n} from \"../raw\";\nimport {Rotation, RotationOps, Vector, VectorOps, scratchBuffer} from \"../math\";\nimport {RigidBody, RigidBodyHandle} from \"./rigid_body\";\nimport {RigidBodySet} from \"./rigid_body_set\";\nimport {Collider, ColliderDesc, ColliderSet} from \"../geometry\";\n\n/**\n * The integer identifier of a soft body added to a `SoftBodySet`.\n */\nexport type SoftBodyHandle = number;\n\n/**\n * The constitutive model of a soft body's cells (triangles in 2D, tetrahedra in 3D).\n */\nexport enum SoftBodyCellModel {\n    /**\n     * Per-cell area/volume preservation constraints (the cell's shape is held by its edges).\n     */\n    Volume = 0,\n    /**\n     * Corotational linear elasticity: a linear material in the cell's rotated frame.\n     */\n    Corotational = 1,\n    /**\n     * Neo-Hookean hyperelasticity, which resists inversion and large compressions.\n     */\n    NeoHookean = 2,\n}\n\n/**\n * Which strains make a soft body's edge rest lengths flow plastically.\n */\nexport enum SoftEdgePlasticFlow {\n    Both = 0,\n    Compression = 1,\n    Tension = 2,\n}\n\n/**\n * Which solver holds the cells of a soft body together.\n */\nexport enum SoftBodySolver {\n    /**\n     * Every element of the lattice becomes a constraint, solved with the contacts and the\n     * joints of the scene.\n     */\n    Constraints = 0,\n    /**\n     * The elasticity of the whole body is assembled into one linear system, solved at each\n     * substep; the stiffness of the body no longer depends on the iteration count. Needs cells.\n     */\n    Fem = 1,\n}\n\n/**\n * What the per-point constraints of the features an intersection-volume constraint acts on do.\n */\nexport enum SoftPatchConstraints {\n    /**\n     * Keep them as they are (they may fight the volume constraint).\n     */\n    Keep = 0,\n    /**\n     * Stand them down: the volume constraint alone acts on those features.\n     */\n    StandDown = 1,\n    /**\n     * Keep them, but along the volume constraint's normal, so they push the way it does.\n     */\n    AlongNormal = 2,\n}\n\n/**\n * The tangle detection and recovery settings shared by every soft body of a world.\n *\n * A plain JavaScript object; read it from `IntegrationParameters.softBodiesRecovery` and\n * assign it back to apply it. Every mechanism switches off individually.\n */\nexport class SoftRecoverySettings {\n    /**\n     * Raise the speculative contact margin from velocities authored between steps, so a fast fresh body does not tunnel (default: `true`).\n     */\n    authoredVelocityMargin: boolean;\n    /**\n     * Give the edge-vs-edge pass a speculative reach, so bodies crossing corner-first collide; on, those constraints leave pressed 3D piles crossed (default: `false`).\n     */\n    edgeSpeculation: boolean;\n    /**\n     * Detect inverted cells (material locally inside out) at each step; feeds the self stand-down (default: `true`).\n     */\n    invertedCellDetection: boolean;\n    /**\n     * Detect surface self-crossings at each step; feeds the self stand-down (default: `true`).\n     */\n    selfCrossingDetection: boolean;\n    /**\n     * Skip the self-crossing sweep while the surface could not have moved far enough to cross itself (default: `true`).\n     */\n    detectionMotionGating: boolean;\n    /**\n     * Detect boundary crossings between pairs of soft surfaces (default: `true`).\n     */\n    crossBodyDetection: boolean;\n    /**\n     * Self contacts of tangled features stand down, so the elasticity resolves the tangle instead of freezing it (default: `true`).\n     */\n    selfStandDown: boolean;\n    /**\n     * A vertex constraint touching a boundary crossing between two surfaces may only expel, never hold (default: `true`).\n     */\n    crossBodyExpelGate: boolean;\n    /**\n     * Edge constraints touching a cross-body boundary crossing stand down (default: `true`).\n     */\n    edgeStandDown: boolean;\n    /**\n     * Constraints on crossing-flagged features repel instead of standing down (default: `false`).\n     */\n    crossingRepulsion: boolean;\n    /**\n     * Guide the crossing repulsion by the pair's volume normal rather than the pierced element's plane normal; closed pairs only (default: `false`).\n     */\n    crossingRepulsionGuide: boolean;\n    /**\n     * Guide the self-crossing repulsion by the fold's volume normal; closed meshes only (default: `false`).\n     */\n    crossingRepulsionSelfGuide: boolean;\n    /**\n     * Intersection-volume contact for closed surfaces: one coupled constraint per overlapping pair, corrected by the intersection volume (default: `true`).\n     */\n    overlapConstraints: boolean;\n    /**\n     * Overlap constraints against rigid colliders too (default: `true`).\n     */\n    overlapRigid: boolean;\n    /**\n     * A self-crossed mesh takes no pair constraint, its volume gradient pointing the wrong way there (default: `true`).\n     */\n    overlapSkipSelfTangled: boolean;\n    /**\n     * The 3D closed-closed edge constraints stand down on a pair an overlap constraint owns (default: `true`).\n     */\n    overlapEdgeStandDown: boolean;\n    /**\n     * Measure the intersection volume on the contact skins instead of the geometric surfaces (default: `false`).\n     */\n    overlapSkinVolume: boolean;\n    /**\n     * Volume constraints on a body's self-overlaps between distinct surface regions; closed meshes only (default: `false`).\n     */\n    overlapSelfRegions: boolean;\n    /**\n     * Push along each constraint's normal instead of the volume gradients, so the whole patch separates along one axis (default: `true`).\n     */\n    overlapNormalPush: boolean;\n    /**\n     * Split each pair's patch into a grid of cells, each with its own constraint, so the pressure varies across the patch (default: `false`).\n     */\n    overlapMultiVolume: boolean;\n    /**\n     * Material recovery pace, in length units per second: the corrective rate allowed to deep recovery, demoted intruders and untangling pulls (default: `0.5`).\n     */\n    recoveryPace: number;\n    /**\n     * Bound on the velocity change the coupled constraint may hand any side per step, in multiples of `recoveryPace` (default: `1.0`).\n     */\n    overlapConstraintPace: number;\n    /**\n     * The skin overlap kept at rest, as a fraction of the pair's skins (default: `0.0`).\n     */\n    overlapKeptDepth: number;\n    /**\n     * Relative drop of the overlap estimate that counts as progress for `overlapPatience` (default: `0.02`).\n     */\n    overlapProgressMargin: number;\n    /**\n     * Cells per tangent axis of the multi-volume grid (default: `3`).\n     */\n    overlapSplit: number;\n    /**\n     * Steps without progress of a pair's volume estimate before its positional correction stands down (default: `240`).\n     */\n    overlapPatience: number;\n    /**\n     * What the per-point constraints of the features inside a volume constraint's patch do\n     * (default: `AlongNormal`).\n     */\n    overlapPatchConstraints: SoftPatchConstraints;\n\n    constructor() {\n        SoftRecoverySettings.copyFromRaw(\n            this,\n            new RawSoftRecoverySettings(),\n            true,\n        );\n    }\n\n    /** @internal */\n    public static fromRaw(raw: RawSoftRecoverySettings): SoftRecoverySettings {\n        let res = new SoftRecoverySettings();\n        SoftRecoverySettings.copyFromRaw(res, raw, true);\n        return res;\n    }\n\n    /** @internal */\n    private static copyFromRaw(\n        target: SoftRecoverySettings,\n        raw: RawSoftRecoverySettings,\n        freeRaw: boolean,\n    ) {\n        target.authoredVelocityMargin = raw.authoredVelocityMargin;\n        target.edgeSpeculation = raw.edgeSpeculation;\n        target.invertedCellDetection = raw.invertedCellDetection;\n        target.selfCrossingDetection = raw.selfCrossingDetection;\n        target.detectionMotionGating = raw.detectionMotionGating;\n        target.crossBodyDetection = raw.crossBodyDetection;\n        target.selfStandDown = raw.selfStandDown;\n        target.crossBodyExpelGate = raw.crossBodyExpelGate;\n        target.edgeStandDown = raw.edgeStandDown;\n        target.crossingRepulsion = raw.crossingRepulsion;\n        target.crossingRepulsionGuide = raw.crossingRepulsionGuide;\n        target.crossingRepulsionSelfGuide = raw.crossingRepulsionSelfGuide;\n        target.overlapConstraints = raw.overlapConstraints;\n        target.overlapRigid = raw.overlapRigid;\n        target.overlapSkipSelfTangled = raw.overlapSkipSelfTangled;\n        target.overlapEdgeStandDown = raw.overlapEdgeStandDown;\n        target.overlapSkinVolume = raw.overlapSkinVolume;\n        target.overlapSelfRegions = raw.overlapSelfRegions;\n        target.overlapNormalPush = raw.overlapNormalPush;\n        target.overlapMultiVolume = raw.overlapMultiVolume;\n        target.recoveryPace = raw.recoveryPace;\n        target.overlapConstraintPace = raw.overlapConstraintPace;\n        target.overlapKeptDepth = raw.overlapKeptDepth;\n        target.overlapProgressMargin = raw.overlapProgressMargin;\n        target.overlapSplit = raw.overlapSplit;\n        target.overlapPatience = raw.overlapPatience;\n        target.overlapPatchConstraints =\n            raw.overlapPatchConstraints as number as SoftPatchConstraints;\n        if (freeRaw) {\n            raw.free();\n        }\n    }\n\n    /** @internal */\n    public intoRaw(): RawSoftRecoverySettings {\n        let raw = new RawSoftRecoverySettings();\n        raw.authoredVelocityMargin = this.authoredVelocityMargin;\n        raw.edgeSpeculation = this.edgeSpeculation;\n        raw.invertedCellDetection = this.invertedCellDetection;\n        raw.selfCrossingDetection = this.selfCrossingDetection;\n        raw.detectionMotionGating = this.detectionMotionGating;\n        raw.crossBodyDetection = this.crossBodyDetection;\n        raw.selfStandDown = this.selfStandDown;\n        raw.crossBodyExpelGate = this.crossBodyExpelGate;\n        raw.edgeStandDown = this.edgeStandDown;\n        raw.crossingRepulsion = this.crossingRepulsion;\n        raw.crossingRepulsionGuide = this.crossingRepulsionGuide;\n        raw.crossingRepulsionSelfGuide = this.crossingRepulsionSelfGuide;\n        raw.overlapConstraints = this.overlapConstraints;\n        raw.overlapRigid = this.overlapRigid;\n        raw.overlapSkipSelfTangled = this.overlapSkipSelfTangled;\n        raw.overlapEdgeStandDown = this.overlapEdgeStandDown;\n        raw.overlapSkinVolume = this.overlapSkinVolume;\n        raw.overlapSelfRegions = this.overlapSelfRegions;\n        raw.overlapNormalPush = this.overlapNormalPush;\n        raw.overlapMultiVolume = this.overlapMultiVolume;\n        raw.recoveryPace = this.recoveryPace;\n        raw.overlapConstraintPace = this.overlapConstraintPace;\n        raw.overlapKeptDepth = this.overlapKeptDepth;\n        raw.overlapProgressMargin = this.overlapProgressMargin;\n        raw.overlapSplit = this.overlapSplit;\n        raw.overlapPatience = this.overlapPatience;\n        raw.overlapPatchConstraints = this\n            .overlapPatchConstraints as number as RawSoftPatchConstraints;\n        return raw;\n    }\n}\n\n/**\n * How the vertices of a deformable collider follow the particles of its cluster.\n */\nexport enum SoftMeshBindingMode {\n    /**\n     * Vertex `i` of the mesh follows the `i`-th particle of the binding's particle list.\n     */\n    Direct = 0,\n    /**\n     * Every vertex follows the particle of the cluster closest to it.\n     */\n    DirectByPosition = 1,\n    /**\n     * Every vertex is embedded in the cell of the cluster holding it (cage simulation).\n     */\n    Skinned = 2,\n}\n\n/**\n * Describes how a deformable collider is bound to the cluster of a soft body.\n */\nexport class SoftMeshBinding {\n    mode: SoftMeshBindingMode;\n    /**\n     * For `SoftMeshBindingMode.Direct`: the particle followed by each vertex of the mesh.\n     */\n    particles: Uint32Array;\n    /**\n     * For `SoftMeshBindingMode.DirectByPosition`: the largest distance between a vertex and\n     * the particle it follows.\n     */\n    eps: number;\n    /**\n     * Whether the mesh collides with itself.\n     */\n    selfContacts: boolean;\n\n    constructor(mode: SoftMeshBindingMode) {\n        this.mode = mode;\n        this.particles = new Uint32Array(0);\n        this.eps = 0.0;\n        this.selfContacts = false;\n    }\n\n    /**\n     * Binds vertex `i` of the mesh to `particles[i]`, which must belong to the cluster.\n     */\n    public static direct(particles: Uint32Array | number[]): SoftMeshBinding {\n        let res = new SoftMeshBinding(SoftMeshBindingMode.Direct);\n        res.particles = Uint32Array.from(particles);\n        return res;\n    }\n\n    /**\n     * Binds every vertex to the particle of the cluster closest to it, within `eps`.\n     */\n    public static directByPosition(eps: number): SoftMeshBinding {\n        let res = new SoftMeshBinding(SoftMeshBindingMode.DirectByPosition);\n        res.eps = eps;\n        return res;\n    }\n\n    /**\n     * Binds every vertex to the cell of the cluster holding it (cage simulation).\n     */\n    public static skinned(): SoftMeshBinding {\n        return new SoftMeshBinding(SoftMeshBindingMode.Skinned);\n    }\n\n    /**\n     * Enables collisions of this mesh with itself.\n     */\n    public setSelfContacts(enabled: boolean): SoftMeshBinding {\n        this.selfContacts = enabled;\n        return this;\n    }\n\n    /** @internal */\n    public rawMode(): RawSoftMeshBindingMode {\n        return this.mode as number as RawSoftMeshBindingMode;\n    }\n}\n\n/**\n * Spring coefficients of an elastic constraint: a natural frequency (Hz) and a damping ratio.\n */\nexport interface SpringCoefficients {\n    naturalFrequency: number;\n    dampingRatio: number;\n}\n\n/**\n * The material of a soft body: the softness of its constraints, its elasticity, plasticity\n * and tearing thresholds.\n *\n * A material is a plain JavaScript object; pass it to `SoftBodyDesc.setMaterial` or\n * `SoftBody.setMaterial` to apply it.\n */\nexport class SoftBodyMaterial {\n    /**\n     * Softness of the structural edges.\n     */\n    edgeSoftness: SpringCoefficients;\n    /**\n     * Softness of the bending constraints (bend edges and dihedrals).\n     */\n    bendSoftness: SpringCoefficients;\n    /**\n     * Softness of the area/volume preservation constraints.\n     */\n    volumeSoftness: SpringCoefficients;\n    /**\n     * Softness of the shape-matching constraints.\n     */\n    shapeMatchingSoftness: SpringCoefficients;\n    /**\n     * Young's modulus of the elastic cells (Corotational and NeoHookean cell models).\n     */\n    youngModulus: number;\n    /**\n     * Poisson's ratio of the elastic cells.\n     */\n    poissonRatio: number;\n    /**\n     * Damping ratio of the elastic cells.\n     */\n    elasticDampingRatio: number;\n    /**\n     * Strain beyond which the rest shape of an elastic cell flows (`0` disables plasticity).\n     */\n    plasticYield: number;\n    /**\n     * Rate (per second) at which an elastic cell's rest shape follows its deformation past the\n     * yield.\n     */\n    plasticCreep: number;\n    /**\n     * Largest accumulated plastic deformation of an elastic cell.\n     */\n    plasticMax: number;\n    /**\n     * Damping of the deformation velocity of the elastic cells.\n     */\n    deformationDamping: number;\n    /**\n     * Strain beyond which the rest length of an edge flows (`0` disables edge plasticity).\n     */\n    edgePlasticYield: number;\n    /**\n     * Rate (per second) at which an edge's rest length follows its stretch past the yield.\n     */\n    edgePlasticCreep: number;\n    /**\n     * Largest relative change of an edge's rest length.\n     */\n    edgePlasticMax: number;\n    /**\n     * Which strains make the edge rest lengths flow.\n     */\n    edgePlasticFlow: SoftEdgePlasticFlow;\n    /**\n     * Strain beyond which an element tears, or `null` for no strain-based tearing.\n     */\n    tearStrain: number | null;\n    /**\n     * Force beyond which an element tears, or `null` for no force-based tearing.\n     */\n    tearForce: number | null;\n    /**\n     * Time constant (seconds) of the smoothing applied to the load before comparing it to\n     * `tearForce`.\n     */\n    tearSmoothing: number;\n    /**\n     * Multiplier of the tear thresholds for the interior elements (relative to the surface).\n     */\n    interiorStrength: number;\n    /**\n     * Largest number of elements torn per step.\n     */\n    maxTearsPerStep: number;\n    /**\n     * Smallest piece (in elements) a tear may split off, or `null` for the default.\n     */\n    minPiece: number | null;\n\n    constructor() {\n        SoftBodyMaterial.copyFromRaw(this, new RawSoftBodyMaterial(), true);\n    }\n\n    /**\n     * A material whose edge, bend, volume and shape-matching softness all take the same value.\n     */\n    public static uniform(\n        naturalFrequency: number,\n        dampingRatio: number,\n    ): SoftBodyMaterial {\n        let res = new SoftBodyMaterial();\n        let raw = RawSoftBodyMaterial.uniform(naturalFrequency, dampingRatio);\n        SoftBodyMaterial.copyFromRaw(res, raw, true);\n        return res;\n    }\n\n    /** @internal */\n    public static fromRaw(raw: RawSoftBodyMaterial): SoftBodyMaterial {\n        let res = new SoftBodyMaterial();\n        SoftBodyMaterial.copyFromRaw(res, raw, true);\n        return res;\n    }\n\n    /** @internal */\n    private static copyFromRaw(\n        target: SoftBodyMaterial,\n        raw: RawSoftBodyMaterial,\n        freeRaw: boolean,\n    ) {\n        target.edgeSoftness = {\n            naturalFrequency: raw.edgeFrequency,\n            dampingRatio: raw.edgeDampingRatio,\n        };\n        target.bendSoftness = {\n            naturalFrequency: raw.bendFrequency,\n            dampingRatio: raw.bendDampingRatio,\n        };\n        target.volumeSoftness = {\n            naturalFrequency: raw.volumeFrequency,\n            dampingRatio: raw.volumeDampingRatio,\n        };\n        target.shapeMatchingSoftness = {\n            naturalFrequency: raw.shapeMatchingFrequency,\n            dampingRatio: raw.shapeMatchingDampingRatio,\n        };\n        target.youngModulus = raw.youngModulus;\n        target.poissonRatio = raw.poissonRatio;\n        target.elasticDampingRatio = raw.elasticDampingRatio;\n        target.plasticYield = raw.plasticYield;\n        target.plasticCreep = raw.plasticCreep;\n        target.plasticMax = raw.plasticMax;\n        target.deformationDamping = raw.deformationDamping;\n        target.edgePlasticYield = raw.edgePlasticYield;\n        target.edgePlasticCreep = raw.edgePlasticCreep;\n        target.edgePlasticMax = raw.edgePlasticMax;\n        target.edgePlasticFlow =\n            raw.edgePlasticFlow as number as SoftEdgePlasticFlow;\n        target.tearStrain = raw.tearStrain ?? null;\n        target.tearForce = raw.tearForce ?? null;\n        target.tearSmoothing = raw.tearSmoothing;\n        target.interiorStrength = raw.interiorStrength;\n        target.maxTearsPerStep = raw.maxTearsPerStep;\n        target.minPiece = raw.minPiece ?? null;\n        if (freeRaw) {\n            raw.free();\n        }\n    }\n\n    /** @internal */\n    public intoRaw(): RawSoftBodyMaterial {\n        let raw = new RawSoftBodyMaterial();\n        raw.edgeFrequency = this.edgeSoftness.naturalFrequency;\n        raw.edgeDampingRatio = this.edgeSoftness.dampingRatio;\n        raw.bendFrequency = this.bendSoftness.naturalFrequency;\n        raw.bendDampingRatio = this.bendSoftness.dampingRatio;\n        raw.volumeFrequency = this.volumeSoftness.naturalFrequency;\n        raw.volumeDampingRatio = this.volumeSoftness.dampingRatio;\n        raw.shapeMatchingFrequency =\n            this.shapeMatchingSoftness.naturalFrequency;\n        raw.shapeMatchingDampingRatio = this.shapeMatchingSoftness.dampingRatio;\n        raw.youngModulus = this.youngModulus;\n        raw.poissonRatio = this.poissonRatio;\n        raw.elasticDampingRatio = this.elasticDampingRatio;\n        raw.plasticYield = this.plasticYield;\n        raw.plasticCreep = this.plasticCreep;\n        raw.plasticMax = this.plasticMax;\n        raw.deformationDamping = this.deformationDamping;\n        raw.edgePlasticYield = this.edgePlasticYield;\n        raw.edgePlasticCreep = this.edgePlasticCreep;\n        raw.edgePlasticMax = this.edgePlasticMax;\n        raw.edgePlasticFlow = this\n            .edgePlasticFlow as number as RawSoftEdgePlasticFlow;\n        raw.tearStrain = this.tearStrain ?? undefined;\n        raw.tearForce = this.tearForce ?? undefined;\n        raw.tearSmoothing = this.tearSmoothing;\n        raw.interiorStrength = this.interiorStrength;\n        raw.maxTearsPerStep = this.maxTearsPerStep;\n        raw.minPiece = this.minPiece ?? undefined;\n        return raw;\n    }\n}\n\n/**\n * A soft body: particles linked by elastic constraints (edges, bending constraints and\n * cells), simulated together with the rigid bodies, contacts and joints of the world.\n *\n * A soft body lives in a `SoftBodySet` and is referenced by its integer `handle`. Its hidden\n * root rigid body (`rootBody()`) stands for the whole body in joints and islands; its clusters\n * add more rigid-body proxies that joints and colliders can attach to.\n */\nexport class SoftBody {\n    private rawSet: RawSoftBodySet; // The SoftBody won't need to free this.\n    private bodies: RigidBodySet;\n    private colliders: ColliderSet;\n    readonly handle: SoftBodyHandle;\n\n    /**\n     * An arbitrary user-defined object associated with this soft body.\n     */\n    public userData?: unknown;\n\n    constructor(\n        rawSet: RawSoftBodySet,\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n        handle: SoftBodyHandle,\n    ) {\n        this.rawSet = rawSet;\n        this.bodies = bodies;\n        this.colliders = colliders;\n        this.handle = handle;\n    }\n\n    /** @internal */\n    public finalizeDeserialization(\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n    ) {\n        this.bodies = bodies;\n        this.colliders = colliders;\n    }\n\n    /**\n     * Checks if this soft body is still valid (i.e. that it has not been deleted from the\n     * soft-body set yet).\n     */\n    public isValid(): boolean {\n        return this.rawSet.contains(this.handle);\n    }\n\n    /**\n     * A counter incremented by every change of the body's topology (tears, cuts, splits).\n     */\n    public topologyVersion(): number {\n        return this.rawSet.sbTopologyVersion(this.handle);\n    }\n\n    /*\n     * Particles.\n     */\n\n    /**\n     * The number of particles of this soft body.\n     */\n    public numParticles(): number {\n        return this.rawSet.sbNumParticles(this.handle);\n    }\n\n    /**\n     * The world-space position of the `i`-th particle.\n     */\n    public particlePosition(i: number, target?: Vector): Vector {\n        this.rawSet.sbParticlePosition(this.handle, i, scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n    /**\n     * The world-space positions of every particle, flattened (two or three floats per\n     * particle).\n     */\n    public particlePositions(): Float32Array {\n        return this.rawSet.sbParticlePositions(this.handle);\n    }\n\n    /**\n     * The velocity of the `i`-th particle.\n     */\n    public particleVelocity(i: number, target?: Vector): Vector {\n        this.rawSet.sbParticleVelocity(this.handle, i, scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n    /**\n     * The velocities of every particle, flattened (two or three floats per particle).\n     */\n    public particleVelocities(): Float32Array {\n        return this.rawSet.sbParticleVelocities(this.handle);\n    }\n\n    /**\n     * The rest position of the `i`-th particle (the position its constraints hold it at).\n     */\n    public particleRestPosition(i: number, target?: Vector): Vector {\n        this.rawSet.sbParticleRestPosition(this.handle, i, scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n    /**\n     * The mass of the `i`-th particle.\n     */\n    public particleMass(i: number): number {\n        return this.rawSet.sbParticleMass(this.handle, i);\n    }\n\n    /**\n     * Is the `i`-th particle pinned (held in place)?\n     */\n    public isParticlePinned(i: number): boolean {\n        return this.rawSet.sbIsParticlePinned(this.handle, i);\n    }\n\n    /**\n     * Does the `i`-th particle lie on the body's surface?\n     */\n    public isParticleOnSurface(i: number): boolean {\n        return this.rawSet.sbIsParticleOnSurface(this.handle, i);\n    }\n\n    /**\n     * Has an element of the `i`-th particle torn?\n     */\n    public isParticleDamaged(i: number): boolean {\n        return this.rawSet.sbIsParticleDamaged(this.handle, i);\n    }\n\n    /**\n     * Sets the world-space position of the `i`-th particle.\n     */\n    public setParticlePosition(i: number, position: Vector) {\n        let rawPos = VectorOps.intoRaw(position);\n        this.rawSet.sbSetParticlePosition(this.handle, i, rawPos);\n        rawPos.free();\n    }\n\n    /**\n     * Sets the velocity of the `i`-th particle.\n     */\n    public setParticleVelocity(i: number, velocity: Vector) {\n        let rawVel = VectorOps.intoRaw(velocity);\n        this.rawSet.sbSetParticleVelocity(this.handle, i, rawVel);\n        rawVel.free();\n    }\n\n    /**\n     * Moves the pinned `i`-th particle to `position` over the next step, like a\n     * position-based kinematic body (it pushes what it meets), then holds it there.\n     * Ignored for a free particle.\n     */\n    public setParticleKinematicTarget(i: number, position: Vector) {\n        let rawPos = VectorOps.intoRaw(position);\n        this.rawSet.sbSetParticleKinematicTarget(this.handle, i, rawPos);\n        rawPos.free();\n    }\n\n    /**\n     * Pins (or releases) the `i`-th particle.\n     */\n    public setParticlePinned(i: number, pinned: boolean) {\n        this.rawSet.sbSetParticlePinned(this.handle, i, pinned);\n    }\n\n    /**\n     * Attaches the `i`-th particle to a rigid body, at the particle's current position.\n     */\n    public attachParticle(i: number, body: RigidBody) {\n        this.rawSet.sbAttachParticle(\n            this.handle,\n            i,\n            body.handle,\n            this.bodies.raw,\n        );\n    }\n\n    /**\n     * Detaches the `i`-th particle from the rigid body it was attached to.\n     *\n     * Returns `false` if the particle was not attached.\n     */\n    public detachParticle(i: number): boolean {\n        return this.rawSet.sbDetachParticle(this.handle, i);\n    }\n\n    /**\n     * The number of particles attached to rigid bodies.\n     */\n    public numAttachments(): number {\n        return this.rawSet.sbNumAttachments(this.handle);\n    }\n\n    /**\n     * The particle of the `i`-th attachment.\n     */\n    public attachmentParticle(i: number): number {\n        return this.rawSet.sbAttachmentParticle(this.handle, i);\n    }\n\n    /**\n     * The rigid body of the `i`-th attachment.\n     */\n    public attachmentBody(i: number): RigidBody {\n        return this.bodies.get(this.rawSet.sbAttachmentBody(this.handle, i));\n    }\n\n    /*\n     * Elements.\n     */\n\n    /**\n     * The number of edges (structural and bending) of this soft body.\n     */\n    public numEdges(): number {\n        return this.rawSet.sbNumEdges(this.handle);\n    }\n\n    /**\n     * The particle pairs of every edge, flattened (two indices per edge).\n     */\n    public edges(): Uint32Array {\n        return this.rawSet.sbEdges(this.handle);\n    }\n\n    /**\n     * The rest length of the `i`-th edge.\n     */\n    public edgeRestLength(i: number): number {\n        return this.rawSet.sbEdgeRestLength(this.handle, i);\n    }\n\n    /**\n     * Is the `i`-th edge a bending edge (rather than a structural one)?\n     */\n    public isEdgeBend(i: number): boolean {\n        return this.rawSet.sbEdgeIsBend(this.handle, i);\n    }\n\n    /**\n     * The impulse applied by the `i`-th edge during the last step.\n     */\n    public edgeImpulse(i: number): number {\n        return this.rawSet.sbEdgeImpulse(this.handle, i);\n    }\n\n    /**\n     * The load of the `i`-th edge relative to its tear threshold (`1` tears it).\n     */\n    public edgeStress(i: number): number {\n        return this.rawSet.sbEdgeStress(this.handle, i);\n    }\n\n    /**\n     * The relative change of the `i`-th edge's rest length due to plastic flow.\n     */\n    public edgePlasticStrain(i: number): number {\n        return this.rawSet.sbEdgePlasticStrain(this.handle, i);\n    }\n\n    /**\n     * The multiplier of the tear thresholds of the `i`-th edge.\n     */\n    public edgeTearResistance(i: number): number {\n        return this.rawSet.sbEdgeTearResistance(this.handle, i);\n    }\n\n    /**\n     * The number of cells (triangles in 2D, tetrahedra in 3D) of this soft body.\n     */\n    public numCells(): number {\n        return this.rawSet.sbNumCells(this.handle);\n    }\n\n    /**\n     * The particles of every cell, flattened (three indices per cell in 2D, four in 3D).\n     */\n    public cells(): Uint32Array {\n        return this.rawSet.sbCells(this.handle);\n    }\n\n    /**\n     * The rest area/volume of the `i`-th cell.\n     */\n    public cellRestVolume(i: number): number {\n        return this.rawSet.sbCellRestVolume(this.handle, i);\n    }\n\n    /**\n     * The load of the `i`-th cell relative to its tear threshold (`1` tears it).\n     */\n    public cellStress(i: number): number {\n        return this.rawSet.sbCellStress(this.handle, i);\n    }\n\n    /**\n     * The stiffness multiplier of the `i`-th cell.\n     */\n    public cellStiffnessScale(i: number): number {\n        return this.rawSet.sbCellStiffnessScale(this.handle, i);\n    }\n\n    /**\n     * The multiplier of the tear thresholds of the `i`-th cell.\n     */\n    public cellTearResistance(i: number): number {\n        return this.rawSet.sbCellTearResistance(this.handle, i);\n    }\n\n    // #if DIM3\n    /**\n     * The number of dihedral bending constraints of this soft body.\n     */\n    public numDihedrals(): number {\n        return this.rawSet.sbNumDihedrals(this.handle);\n    }\n\n    /**\n     * The particles of every dihedral, flattened (four indices per dihedral: the shared edge,\n     * then the two opposite vertices).\n     */\n    public dihedrals(): Uint32Array {\n        return this.rawSet.sbDihedrals(this.handle);\n    }\n\n    /**\n     * The rest angle of the `i`-th dihedral.\n     */\n    public dihedralRestAngle(i: number): number {\n        return this.rawSet.sbDihedralRestAngle(this.handle, i);\n    }\n    // #endif\n\n    /**\n     * The boundary elements of this soft body (segments in 2D, triangles in 3D), flattened\n     * (two or three particle indices per element), oriented outward.\n     */\n    public boundary(): Uint32Array {\n        return this.rawSet.sbBoundary(this.handle);\n    }\n\n    /*\n     * Material.\n     */\n\n    /**\n     * A copy of this soft body's material.\n     */\n    public material(): SoftBodyMaterial {\n        return SoftBodyMaterial.fromRaw(this.rawSet.sbMaterial(this.handle));\n    }\n\n    /**\n     * Replaces this soft body's material.\n     */\n    public setMaterial(material: SoftBodyMaterial) {\n        let raw = material.intoRaw();\n        this.rawSet.sbSetMaterial(this.handle, raw);\n        raw.free();\n    }\n\n    /**\n     * The constitutive model of this soft body's cells.\n     */\n    public cellModel(): SoftBodyCellModel {\n        return this.rawSet.sbCellModel(\n            this.handle,\n        ) as number as SoftBodyCellModel;\n    }\n\n    /**\n     * The solver holding the cells of this soft body together.\n     */\n    public solver(): SoftBodySolver {\n        return this.rawSet.sbSolver(this.handle) as number as SoftBodySolver;\n    }\n\n    /**\n     * Sets the solver holding the cells of this soft body together.\n     */\n    public setSolver(solver: SoftBodySolver) {\n        this.rawSet.sbSetSolver(\n            this.handle,\n            solver as number as RawSoftBodySolver,\n        );\n    }\n\n    /**\n     * Is the global area/volume preservation of this soft body enabled?\n     */\n    public volumePreservationEnabled(): boolean {\n        return this.rawSet.sbVolumePreservationEnabled(this.handle);\n    }\n\n    /**\n     * Enables or disables the global area/volume preservation of this soft body.\n     */\n    public enableVolumePreservation(enabled: boolean) {\n        this.rawSet.sbEnableVolumePreservation(this.handle, enabled);\n    }\n\n    /**\n     * The rest area/volume enclosed by this soft body's closed surfaces.\n     */\n    public restVolume(): number {\n        return this.rawSet.sbRestVolume(this.handle);\n    }\n\n    /**\n     * The current area/volume enclosed by this soft body's closed surfaces.\n     */\n    public volume(): number {\n        return this.rawSet.sbVolume(this.handle);\n    }\n\n    /**\n     * The target volume multiplier of the volume preservation (`> 1` inflates the body).\n     */\n    public volumeFactor(): number {\n        return this.rawSet.sbVolumeFactor(this.handle);\n    }\n\n    /**\n     * Sets the target volume multiplier of the volume preservation (`> 1` inflates the body).\n     */\n    public setVolumeFactor(factor: number) {\n        this.rawSet.sbSetVolumeFactor(this.handle, factor);\n    }\n\n    /**\n     * The thickness of this soft body's particles.\n     */\n    public particleRadius(): number {\n        return this.rawSet.sbParticleRadius(this.handle);\n    }\n\n    /**\n     * Forgets every plastic deformation: the rest shapes return to their initial values.\n     */\n    public resetPlasticity() {\n        this.rawSet.sbResetPlasticity(this.handle);\n    }\n\n    /*\n     * Whole-body state.\n     */\n\n    /**\n     * The hidden rigid body standing for this soft body in joints and islands.\n     */\n    public rootBody(): RigidBody {\n        return this.bodies.get(this.rawSet.sbRootBody(this.handle));\n    }\n\n    /**\n     * The soft body this one was split off from by a tear, if any.\n     */\n    public origin(): SoftBodyHandle | null {\n        let origin = this.rawSet.sbOrigin(this.handle);\n        return origin === undefined ? null : origin;\n    }\n\n    /**\n     * The handles of the soft bodies that tears split off from this one.\n     */\n    public pieces(): SoftBodyHandle[] {\n        return Array.from(this.rawSet.sbPieces(this.handle));\n    }\n\n    /**\n     * The center of mass of this soft body's particles.\n     */\n    public centerOfMass(target?: Vector): Vector {\n        this.rawSet.sbCenterOfMass(this.handle, scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n    /**\n     * The total mass of this soft body's particles.\n     */\n    public mass(): number {\n        return this.rawSet.sbMass(this.handle);\n    }\n\n    /**\n     * Is this soft body sleeping?\n     */\n    public isSleeping(): boolean {\n        return this.rawSet.sbIsSleeping(this.handle);\n    }\n\n    /**\n     * Wakes this soft body up.\n     */\n    public wakeUp() {\n        this.rawSet.sbWakeUp(this.handle);\n    }\n\n    /**\n     * Is this soft body enabled (simulated)?\n     */\n    public isEnabled(): boolean {\n        return this.rawSet.sbIsEnabled(this.handle);\n    }\n\n    /**\n     * Enables or disables this soft body.\n     */\n    public setEnabled(enabled: boolean) {\n        this.rawSet.sbSetEnabled(this.handle, enabled);\n    }\n\n    /**\n     * Sets the extra internal PGS iterations run per substep for this soft body and\n     * everything it touches.\n     */\n    public setAdditionalPgsIterations(iterations: number) {\n        this.rawSet.sbSetAdditionalPgsIterations(this.handle, iterations);\n    }\n\n    /**\n     * The linear damping of this soft body's particles.\n     */\n    public linearDamping(): number {\n        return this.rawSet.sbLinearDamping(this.handle);\n    }\n\n    /**\n     * The gravity scale of this soft body's particles.\n     */\n    public gravityScale(): number {\n        return this.rawSet.sbGravityScale(this.handle);\n    }\n\n    /*\n     * Forces and impulses.\n     */\n\n    /**\n     * Adds a force to every particle of this soft body (spread by mass).\n     */\n    public addForce(force: Vector, wakeUp: boolean) {\n        let rawForce = VectorOps.intoRaw(force);\n        this.rawSet.sbAddForce(this.handle, rawForce, wakeUp);\n        rawForce.free();\n    }\n\n    /**\n     * Adds a force to the `i`-th particle of this soft body.\n     */\n    public addParticleForce(i: number, force: Vector, wakeUp: boolean) {\n        let rawForce = VectorOps.intoRaw(force);\n        this.rawSet.sbAddParticleForce(this.handle, i, rawForce, wakeUp);\n        rawForce.free();\n    }\n\n    /**\n     * Resets the user forces applied to this soft body's particles.\n     */\n    public resetForces(wakeUp: boolean) {\n        this.rawSet.sbResetForces(this.handle, wakeUp);\n    }\n\n    /**\n     * Applies an impulse to every particle of this soft body (spread by mass).\n     */\n    public applyImpulse(impulse: Vector, wakeUp: boolean) {\n        let rawImpulse = VectorOps.intoRaw(impulse);\n        this.rawSet.sbApplyImpulse(this.handle, rawImpulse, wakeUp);\n        rawImpulse.free();\n    }\n\n    /**\n     * Applies an impulse to the `i`-th particle of this soft body.\n     */\n    public applyParticleImpulse(i: number, impulse: Vector, wakeUp: boolean) {\n        let rawImpulse = VectorOps.intoRaw(impulse);\n        this.rawSet.sbApplyParticleImpulse(this.handle, i, rawImpulse, wakeUp);\n        rawImpulse.free();\n    }\n\n    /**\n     * Applies an impulse to the particles within `falloffRadius` of `point`, scaled down\n     * linearly with their distance to it (`falloffRadius <= 0` applies it to every particle).\n     */\n    public applyImpulseAtPoint(\n        impulse: Vector,\n        point: Vector,\n        falloffRadius: number,\n        wakeUp: boolean,\n    ) {\n        let rawImpulse = VectorOps.intoRaw(impulse);\n        let rawPoint = VectorOps.intoRaw(point);\n        this.rawSet.sbApplyImpulseAtPoint(\n            this.handle,\n            rawImpulse,\n            rawPoint,\n            falloffRadius,\n            wakeUp,\n        );\n        rawImpulse.free();\n        rawPoint.free();\n    }\n\n    /**\n     * Applies an impulse of the given magnitude pushing the particles away from `center`\n     * (a blast), scaled down linearly up to `falloffRadius`.\n     */\n    public applyRadialImpulse(\n        center: Vector,\n        magnitude: number,\n        falloffRadius: number,\n        wakeUp: boolean,\n    ) {\n        let rawCenter = VectorOps.intoRaw(center);\n        this.rawSet.sbApplyRadialImpulse(\n            this.handle,\n            rawCenter,\n            magnitude,\n            falloffRadius,\n            wakeUp,\n        );\n        rawCenter.free();\n    }\n\n    /*\n     * Tearing.\n     */\n\n    /**\n     * Requests the `i`-th edge to tear at the end of the next step.\n     */\n    public tearEdge(i: number) {\n        this.rawSet.sbTearEdge(this.handle, i);\n    }\n\n    /**\n     * Requests the `i`-th cell to tear at the end of the next step.\n     */\n    public tearCell(i: number) {\n        this.rawSet.sbTearCell(this.handle, i);\n    }\n\n    /**\n     * Are there tears requested for the next step?\n     */\n    public hasPendingTears(): boolean {\n        return this.rawSet.sbHasPendingTears(this.handle);\n    }\n\n    /*\n     * Clusters.\n     */\n\n    /**\n     * The number of cluster slots of this soft body (some may have been removed: see\n     * `isClusterLive`).\n     */\n    public numClusters(): number {\n        return this.rawSet.sbNumClusters(this.handle);\n    }\n\n    /**\n     * Does the `i`-th cluster still exist?\n     */\n    public isClusterLive(i: number): boolean {\n        return this.rawSet.sbIsClusterLive(this.handle, i);\n    }\n\n    /**\n     * The rigid body standing for the `i`-th cluster: joints and colliders attach to it.\n     */\n    public clusterProxy(i: number): RigidBody | null {\n        let proxy = this.rawSet.sbClusterProxy(this.handle, i);\n        return proxy === undefined ? null : this.bodies.get(proxy);\n    }\n\n    /**\n     * The particles of the `i`-th cluster.\n     */\n    public clusterParticles(i: number): Uint32Array {\n        return this.rawSet.sbClusterParticles(this.handle, i);\n    }\n\n    /**\n     * Does the `i`-th cluster hold its shape by shape matching?\n     */\n    public clusterShapeMatchingEnabled(i: number): boolean {\n        return this.rawSet.sbClusterShapeMatchingEnabled(this.handle, i);\n    }\n\n    /**\n     * Enables or disables shape matching on the `i`-th cluster.\n     */\n    public enableClusterShapeMatching(i: number, enabled: boolean) {\n        this.rawSet.sbEnableClusterShapeMatching(this.handle, i, enabled);\n    }\n\n    /**\n     * Scales the stiffness of the elements of the `i`-th cluster.\n     */\n    public setClusterStiffnessScale(i: number, scale: number) {\n        this.rawSet.sbSetClusterStiffnessScale(this.handle, i, scale);\n    }\n\n    /**\n     * Overrides the softness of the edges of the `i`-th cluster (`null` restores the\n     * material's).\n     */\n    public setClusterEdgeSoftness(\n        i: number,\n        softness: SpringCoefficients | null,\n    ) {\n        this.rawSet.sbSetClusterEdgeSoftness(\n            this.handle,\n            i,\n            softness ? softness.naturalFrequency : undefined,\n            softness ? softness.dampingRatio : undefined,\n        );\n    }\n\n    /**\n     * Scales the tear thresholds of the elements of the `i`-th cluster.\n     */\n    public setClusterTearResistance(i: number, resistance: number) {\n        this.rawSet.sbSetClusterTearResistance(this.handle, i, resistance);\n    }\n\n    /**\n     * Pins (or releases) every particle of the `i`-th cluster.\n     */\n    public setClusterPinned(i: number, pinned: boolean) {\n        this.rawSet.sbSetClusterPinned(this.handle, i, pinned);\n    }\n\n    /**\n     * Moves the `i`-th cluster rigidly to the given pose over the next step.\n     */\n    public setClusterKinematicTarget(\n        i: number,\n        translation: Vector,\n        rotation: Rotation,\n    ) {\n        let rawTra = VectorOps.intoRaw(translation);\n        let rawRot = RotationOps.intoRaw(rotation);\n        this.rawSet.sbSetClusterKinematicTarget(this.handle, i, rawTra, rawRot);\n        rawTra.free();\n        rawRot.free();\n    }\n\n    /*\n     * Collision meshes.\n     */\n\n    /**\n     * The number of collision meshes held by this soft body's clusters (its own deformable\n     * surface included).\n     */\n    public numMeshes(): number {\n        return this.rawSet.sbNumMeshes(this.handle);\n    }\n\n    /**\n     * The cluster holding the `i`-th collision mesh.\n     */\n    public meshCluster(i: number): number | null {\n        let cluster = this.rawSet.sbMeshCluster(this.handle, i);\n        return cluster === undefined ? null : cluster;\n    }\n\n    /**\n     * The collider holding the `i`-th collision mesh.\n     */\n    public meshCollider(i: number): Collider | null {\n        let collider = this.rawSet.sbMeshCollider(this.handle, i);\n        return collider === undefined ? null : this.colliders.get(collider);\n    }\n\n    /**\n     * Is the `i`-th collision mesh skinned (embedded in the cells) rather than bound\n     * vertex-to-particle?\n     */\n    public isMeshSkinned(i: number): boolean {\n        return this.rawSet.sbMeshIsSkinned(this.handle, i);\n    }\n\n    /**\n     * Does the `i`-th collision mesh collide?\n     */\n    public meshCollisionEnabled(i: number): boolean {\n        return this.rawSet.sbMeshCollisionEnabled(this.handle, i);\n    }\n\n    /**\n     * Does the shape of the `i`-th collision mesh carry the `ORIENTED` flag (see\n     * `SoftBodyDesc.setOriented`)?\n     */\n    public isMeshOriented(i: number): boolean {\n        return this.rawSet.sbMeshIsOriented(this.handle, i);\n    }\n\n    /**\n     * The world-space vertex positions of the `i`-th collision mesh, flattened.\n     */\n    public meshVertices(i: number): Float32Array {\n        return this.rawSet.sbMeshVertices(this.handle, i);\n    }\n\n    /**\n     * The elements of the `i`-th collision mesh, flattened (two vertex indices per segment in\n     * 2D, three per triangle in 3D).\n     */\n    public meshIndices(i: number): Uint32Array {\n        return this.rawSet.sbMeshIndices(this.handle, i);\n    }\n\n    /**\n     * The index of the collision mesh held by a deformable collider of this soft body.\n     */\n    public meshOfCollider(collider: Collider): number | null {\n        let mesh = this.rawSet.sbMeshOfCollider(this.handle, collider.handle);\n        return mesh === undefined ? null : mesh;\n    }\n}\n\n/**\n * The description of a soft body to create.\n *\n * Start from one of the generators (`SoftBodyDesc.rope`, `cloth`, `cuboid`, `sphere`,\n * `trimesh`, `volumetric` in 3D; `rope`, `polygon`, `disk`, `grid`, `polyline`, `volumetric`\n * in 2D) or from raw particle positions, then tune it with the chainable setters. The\n * description holds no WASM memory: it is applied when the soft body is created.\n */\nexport class SoftBodyDesc {\n    private generator: () => RawSoftBodyBuilder;\n    private setters: Array<(raw: RawSoftBodyBuilder) => void>;\n    /**\n     * The material of the soft body, or `null` to keep the default one (with `softness`\n     * applied on top when set).\n     */\n    material: SoftBodyMaterial | null;\n    /**\n     * A uniform softness applied to every constraint of the material, or `null`.\n     */\n    softness: SpringCoefficients | null;\n    /**\n     * The uniform mass of the particles (ignored when `masses` is set).\n     */\n    particleMass: number;\n    /**\n     * The total mass of the body, spread over its particles, or `null` to use `particleMass`.\n     */\n    mass: number | null;\n    /**\n     * Per-particle masses, or `null` for uniform masses.\n     */\n    masses: Float32Array | null;\n    /**\n     * The indices of the pinned particles.\n     */\n    pinnedParticles: Uint32Array;\n    /**\n     * The constitutive model of the cells.\n     */\n    cellModel: SoftBodyCellModel;\n    /**\n     * The solver holding the cells together.\n     */\n    solver: SoftBodySolver;\n    /**\n     * Whether the area/volume enclosed by the body's closed surfaces is preserved (`null`:\n     * what the generator chose, off for raw positions).\n     */\n    volumePreservation: boolean | null;\n    /**\n     * The target volume multiplier of the volume preservation (`> 1` inflates the body).\n     */\n    volumeFactor: number;\n    /**\n     * Whether shape matching holds the body's shape (`null`: what the generator chose, off for\n     * raw positions).\n     */\n    shapeMatching: boolean | null;\n    /**\n     * Whether the body's surface collides with itself.\n     */\n    selfContacts: boolean;\n    /**\n     * Whether the shape of the body's collision surface is built with the `ORIENTED` flag\n     * (`null`: whenever the surface is closed).\n     */\n    oriented: boolean | null;\n    /**\n     * The thickness of the particles (`null`: what the generator chose).\n     */\n    particleRadius: number | null;\n    /**\n     * The template of the body's colliders (their shape is replaced by the body's deformable\n     * surface), or `null` for a body without collisions.\n     */\n    surfaceCollider: ColliderDesc | null;\n    /**\n     * Whether the body collides through its skin rather than through its cells' boundary.\n     */\n    skinCollision: boolean;\n    /**\n     * A translation applied to every particle.\n     */\n    translation: Vector | null;\n    /**\n     * Linear damping of the particles.\n     */\n    linearDamping: number;\n    /**\n     * Gravity scale of the particles.\n     */\n    gravityScale: number;\n    /**\n     * Extra solver substeps requested for the body and everything it touches.\n     */\n    additionalSolverIterations: number;\n    /**\n     * Extra internal PGS iterations per substep for the body and everything it touches.\n     */\n    additionalPgsIterations: number;\n    /**\n     * Whether the body may fall asleep.\n     */\n    canSleep: boolean;\n    /**\n     * The dominance group of the body.\n     */\n    dominanceGroup: number;\n    /**\n     * An arbitrary user-defined object associated with the soft body.\n     */\n    userData?: unknown;\n\n    /**\n     * A description over raw world-space particle positions (flattened), with no element:\n     * add edges, cells and a surface with the setters.\n     */\n    constructor(positions?: Float32Array | number[]) {\n        let flat = positions\n            ? Float32Array.from(positions)\n            : new Float32Array(0);\n        this.generator = () => new RawSoftBodyBuilder(flat);\n        this.setters = [];\n        this.material = null;\n        this.softness = null;\n        this.particleMass = 1.0;\n        this.mass = null;\n        this.masses = null;\n        this.pinnedParticles = new Uint32Array(0);\n        this.cellModel = SoftBodyCellModel.Volume;\n        this.solver = SoftBodySolver.Constraints;\n        this.volumePreservation = null;\n        this.volumeFactor = 1.0;\n        this.shapeMatching = null;\n        this.selfContacts = false;\n        this.oriented = null;\n        this.particleRadius = null;\n        this.surfaceCollider = ColliderDesc.ball(0.05);\n        this.skinCollision = false;\n        this.translation = null;\n        this.linearDamping = 0.0;\n        this.gravityScale = 1.0;\n        this.additionalSolverIterations = 0;\n        this.additionalPgsIterations = 3;\n        this.canSleep = true;\n        this.dominanceGroup = 0;\n    }\n\n    private static withGenerator(\n        generator: () => RawSoftBodyBuilder | undefined,\n    ): SoftBodyDesc | null {\n        // Run it once to know whether the geometry is valid.\n        let probe = generator();\n        if (!probe) {\n            return null;\n        }\n        probe.free();\n        let desc = new SoftBodyDesc();\n        desc.generator = generator as () => RawSoftBodyBuilder;\n        return desc;\n    }\n\n    /**\n     * A rope of `numParticles` particles from `start` to `end`.\n     */\n    public static rope(\n        start: Vector,\n        end: Vector,\n        numParticles: number,\n    ): SoftBodyDesc {\n        return SoftBodyDesc.withGenerator(() => {\n            let rawStart = VectorOps.intoRaw(start);\n            let rawEnd = VectorOps.intoRaw(end);\n            let raw = RawSoftBodyBuilder.rope(rawStart, rawEnd, numParticles);\n            rawStart.free();\n            rawEnd.free();\n            return raw;\n        });\n    }\n\n    /**\n     * A body filling the closed surface (segments in 2D, triangles in 3D) with cells of the\n     * given size; `skinned` keeps the surface as a skin embedded in the cells. Returns\n     * `null` if the surface cannot be meshed.\n     *\n     * @param vertices - The flattened world-space vertices of the surface.\n     * @param indices - The flattened elements of the surface.\n     */\n    public static volumetric(\n        vertices: Float32Array,\n        indices: Uint32Array,\n        cellSize: number,\n        skinned: boolean = false,\n    ): SoftBodyDesc | null {\n        return SoftBodyDesc.withGenerator(() =>\n            RawSoftBodyBuilder.volumetric(vertices, indices, cellSize, skinned),\n        );\n    }\n\n\n    // #if DIM3\n    /**\n     * A triangle-mesh body without cells: the vertices are particles, the triangles the\n     * surface, held by dihedral bending and shape matching. Returns `null` if the mesh is\n     * empty.\n     */\n    public static trimesh(\n        vertices: Float32Array,\n        indices: Uint32Array,\n    ): SoftBodyDesc | null {\n        return SoftBodyDesc.withGenerator(() =>\n            RawSoftBodyBuilder.trimesh(vertices, indices),\n        );\n    }\n\n    /**\n     * A cloth of `nu` by `nv` particles: particle `(i, j)` is at `origin + i * du + j * dv`.\n     */\n    public static cloth(\n        origin: Vector,\n        du: Vector,\n        dv: Vector,\n        nu: number,\n        nv: number,\n    ): SoftBodyDesc {\n        return SoftBodyDesc.withGenerator(() => {\n            let rawOrigin = VectorOps.intoRaw(origin);\n            let rawDu = VectorOps.intoRaw(du);\n            let rawDv = VectorOps.intoRaw(dv);\n            let raw = RawSoftBodyBuilder.cloth(rawOrigin, rawDu, rawDv, nu, nv);\n            rawOrigin.free();\n            rawDu.free();\n            rawDv.free();\n            return raw;\n        });\n    }\n\n    /**\n     * A tube of cloth around `axis`, from `radiusStart` at `origin` to `radiusEnd` at its\n     * other end, with `numAround` particles per ring and `numAlong` rings.\n     */\n    public static clothTube(\n        origin: Vector,\n        axis: Vector,\n        radiusStart: number,\n        radiusEnd: number,\n        numAround: number,\n        numAlong: number,\n    ): SoftBodyDesc {\n        return SoftBodyDesc.withGenerator(() => {\n            let rawOrigin = VectorOps.intoRaw(origin);\n            let rawAxis = VectorOps.intoRaw(axis);\n            let raw = RawSoftBodyBuilder.clothTube(\n                rawOrigin,\n                rawAxis,\n                radiusStart,\n                radiusEnd,\n                numAround,\n                numAlong,\n            );\n            rawOrigin.free();\n            rawAxis.free();\n            return raw;\n        });\n    }\n\n    /**\n     * A cloth with different softness along `du` (warp), along `dv` (weft) and across the\n     * diagonals (shear).\n     */\n    public static clothAnisotropic(\n        origin: Vector,\n        du: Vector,\n        dv: Vector,\n        nu: number,\n        nv: number,\n        warp: SpringCoefficients,\n        weft: SpringCoefficients,\n        shear: SpringCoefficients,\n    ): SoftBodyDesc {\n        return SoftBodyDesc.withGenerator(() => {\n            let rawOrigin = VectorOps.intoRaw(origin);\n            let rawDu = VectorOps.intoRaw(du);\n            let rawDv = VectorOps.intoRaw(dv);\n            let raw = RawSoftBodyBuilder.clothAnisotropic(\n                rawOrigin,\n                rawDu,\n                rawDv,\n                nu,\n                nv,\n                warp.naturalFrequency,\n                warp.dampingRatio,\n                weft.naturalFrequency,\n                weft.dampingRatio,\n                shear.naturalFrequency,\n                shear.dampingRatio,\n            );\n            rawOrigin.free();\n            rawDu.free();\n            rawDv.free();\n            return raw;\n        });\n    }\n\n    /**\n     * A box of `nx` by `ny` by `nz` particles filled with tetrahedral cells.\n     */\n    public static cuboid(\n        center: Vector,\n        halfExtents: Vector,\n        nx: number,\n        ny: number,\n        nz: number,\n    ): SoftBodyDesc {\n        return SoftBodyDesc.withGenerator(() => {\n            let rawCenter = VectorOps.intoRaw(center);\n            let rawHalf = VectorOps.intoRaw(halfExtents);\n            let raw = RawSoftBodyBuilder.cuboid(rawCenter, rawHalf, nx, ny, nz);\n            rawCenter.free();\n            rawHalf.free();\n            return raw;\n        });\n    }\n\n    /**\n     * A hollow sphere: an icosphere surface with `subdivisions` refinement levels, holding\n     * its volume (a balloon).\n     */\n    public static sphere(\n        center: Vector,\n        radius: number,\n        subdivisions: number,\n    ): SoftBodyDesc {\n        return SoftBodyDesc.withGenerator(() => {\n            let rawCenter = VectorOps.intoRaw(center);\n            let raw = RawSoftBodyBuilder.sphere(\n                rawCenter,\n                radius,\n                subdivisions,\n            );\n            rawCenter.free();\n            return raw;\n        });\n    }\n    // #endif\n\n    /*\n     * Chainable setters.\n     */\n\n    /**\n     * Sets the material of the soft body.\n     */\n    public setMaterial(material: SoftBodyMaterial): SoftBodyDesc {\n        this.material = material;\n        return this;\n    }\n\n    /**\n     * Sets a uniform softness for every constraint of the material.\n     */\n    public setSoftness(\n        naturalFrequency: number,\n        dampingRatio: number,\n    ): SoftBodyDesc {\n        this.softness = {naturalFrequency, dampingRatio};\n        return this;\n    }\n\n    /**\n     * Sets the uniform mass of the particles.\n     */\n    public setParticleMass(mass: number): SoftBodyDesc {\n        this.particleMass = mass;\n        this.masses = null;\n        return this;\n    }\n\n    /**\n     * Sets the total mass of the body, spread over its particles.\n     */\n    public setMass(mass: number): SoftBodyDesc {\n        this.mass = mass;\n        return this;\n    }\n\n    /**\n     * Sets per-particle masses.\n     */\n    public setMasses(masses: Float32Array | number[]): SoftBodyDesc {\n        this.masses = Float32Array.from(masses);\n        return this;\n    }\n\n    /**\n     * Pins the given particles in place.\n     */\n    public setPinnedParticles(pinned: Uint32Array | number[]): SoftBodyDesc {\n        this.pinnedParticles = Uint32Array.from(pinned);\n        return this;\n    }\n\n    /**\n     * Replaces the structural edges (flattened particle pairs).\n     */\n    public setEdges(edges: Uint32Array | number[]): SoftBodyDesc {\n        let flat = Uint32Array.from(edges);\n        this.setters.push((raw) => raw.setEdges(flat));\n        return this;\n    }\n\n    /**\n     * Adds structural edges (flattened particle pairs).\n     */\n    public addEdges(edges: Uint32Array | number[]): SoftBodyDesc {\n        let flat = Uint32Array.from(edges);\n        this.setters.push((raw) => raw.addEdges(flat));\n        return this;\n    }\n\n    /**\n     * Replaces the bending edges (flattened particle pairs).\n     */\n    public setBendEdges(edges: Uint32Array | number[]): SoftBodyDesc {\n        let flat = Uint32Array.from(edges);\n        this.setters.push((raw) => raw.setBendEdges(flat));\n        return this;\n    }\n\n    /**\n     * Makes every edge resist stretching only (a rope or a net that folds freely).\n     */\n    public setTensionOnly(): SoftBodyDesc {\n        this.setters.push((raw) => raw.setTensionOnly());\n        return this;\n    }\n\n    // #if DIM3\n    /**\n     * Replaces the dihedral bending constraints (flattened quadruplets: the shared edge, then\n     * the two opposite vertices).\n     */\n    public setDihedrals(dihedrals: Uint32Array | number[]): SoftBodyDesc {\n        let flat = Uint32Array.from(dihedrals);\n        this.setters.push((raw) => raw.setDihedrals(flat));\n        return this;\n    }\n\n    /**\n     * Sets the segments a body without surface collides through (a wire).\n     */\n    public setWire(segments: Uint32Array | number[]): SoftBodyDesc {\n        let flat = Uint32Array.from(segments);\n        this.setters.push((raw) => raw.setWire(flat));\n        return this;\n    }\n    // #endif\n\n    /**\n     * Replaces the cells (flattened triangles in 2D, tetrahedra in 3D).\n     */\n    public setCells(cells: Uint32Array | number[]): SoftBodyDesc {\n        let flat = Uint32Array.from(cells);\n        this.setters.push((raw) => raw.setCells(flat));\n        return this;\n    }\n\n    /**\n     * Replaces the boundary elements (flattened segments in 2D, triangles in 3D), oriented\n     * outward.\n     */\n    public setSurface(surface: Uint32Array | number[]): SoftBodyDesc {\n        let flat = Uint32Array.from(surface);\n        this.setters.push((raw) => raw.setSurface(flat));\n        return this;\n    }\n\n    /**\n     * Sets a skin: a finer mesh (flattened world-space vertices and elements) embedded in the\n     * cells, which follows them.\n     */\n    public setSkin(\n        vertices: Float32Array | number[],\n        indices: Uint32Array | number[],\n    ): SoftBodyDesc {\n        let flatVertices = Float32Array.from(vertices);\n        let flatIndices = Uint32Array.from(indices);\n        this.setters.push((raw) => raw.setSkin(flatVertices, flatIndices));\n        return this;\n    }\n\n    /**\n     * Makes the body collide through its skin rather than through its cells' boundary.\n     */\n    public setSkinCollision(enabled: boolean): SoftBodyDesc {\n        this.skinCollision = enabled;\n        return this;\n    }\n\n    /**\n     * Overrides the softness of the given edges.\n     */\n    public setEdgeSoftness(\n        edges: Uint32Array | number[],\n        softness: SpringCoefficients[],\n    ): SoftBodyDesc {\n        let flatEdges = Uint32Array.from(edges);\n        let frequencies = Float32Array.from(\n            softness.map((s) => s.naturalFrequency),\n        );\n        let dampings = Float32Array.from(softness.map((s) => s.dampingRatio));\n        this.setters.push((raw) =>\n            raw.setEdgeSoftness(flatEdges, frequencies, dampings),\n        );\n        return this;\n    }\n\n    /**\n     * Multiplies the tear thresholds of the given edges.\n     */\n    public setEdgeTearResistance(\n        edges: Uint32Array | number[],\n        resistances: Float32Array | number[],\n    ): SoftBodyDesc {\n        let flatEdges = Uint32Array.from(edges);\n        let flatResistances = Float32Array.from(resistances);\n        this.setters.push((raw) =>\n            raw.setEdgeTearResistance(flatEdges, flatResistances),\n        );\n        return this;\n    }\n\n    /**\n     * Sets the constitutive model of the cells.\n     */\n    public setCellModel(model: SoftBodyCellModel): SoftBodyDesc {\n        this.cellModel = model;\n        return this;\n    }\n\n    /**\n     * Sets the solver holding the cells together (`SoftBodySolver.Fem` needs cells).\n     */\n    public setSolver(solver: SoftBodySolver): SoftBodyDesc {\n        this.solver = solver;\n        return this;\n    }\n\n    /**\n     * Enables the preservation of the area/volume enclosed by the body's closed surfaces.\n     */\n    public setVolumePreservation(enabled: boolean): SoftBodyDesc {\n        this.volumePreservation = enabled;\n        return this;\n    }\n\n    /**\n     * Sets the target volume multiplier (`> 1` inflates the body); this also enables the\n     * volume preservation.\n     */\n    public setVolumeFactor(factor: number): SoftBodyDesc {\n        this.volumeFactor = factor;\n        this.volumePreservation = true;\n        return this;\n    }\n\n    /**\n     * Holds the body's shape by shape matching.\n     */\n    public setShapeMatching(enabled: boolean): SoftBodyDesc {\n        this.shapeMatching = enabled;\n        return this;\n    }\n\n    /**\n     * Makes the body's surface collide with itself.\n     */\n    public setSelfContacts(enabled: boolean): SoftBodyDesc {\n        this.selfContacts = enabled;\n        return this;\n    }\n\n    /**\n     * Sets whether the shape of the body's collision surface is built with the `ORIENTED`\n     * flag, like a polyline or mesh. Left unset, it is whenever the surface is closed, which\n     * is what a solid body wants: an oriented closed surface encloses matter, so nothing is\n     * held inside it. Set it to `false` for a shell, whose inner side holds the bodies inside\n     * it.\n     */\n    public setOriented(oriented: boolean): SoftBodyDesc {\n        this.oriented = oriented;\n        return this;\n    }\n\n    /**\n     * Sets the thickness of the particles.\n     */\n    public setParticleRadius(radius: number): SoftBodyDesc {\n        this.particleRadius = radius;\n        return this;\n    }\n\n    /**\n     * Sets the template of the body's colliders: its friction, restitution, groups, events\n     * and other settings are kept, its shape is replaced by the body's deformable surface.\n     */\n    public setSurfaceCollider(collider: ColliderDesc): SoftBodyDesc {\n        this.surfaceCollider = collider;\n        return this;\n    }\n\n    /**\n     * Removes the body's colliders: it will not collide with anything.\n     */\n    public setNoSurfaceCollider(): SoftBodyDesc {\n        this.surfaceCollider = null;\n        return this;\n    }\n\n    /**\n     * Translates every particle.\n     */\n    public setTranslation(translation: Vector): SoftBodyDesc {\n        this.translation = translation;\n        return this;\n    }\n\n    /**\n     * Sets the linear damping of the particles.\n     */\n    public setLinearDamping(damping: number): SoftBodyDesc {\n        this.linearDamping = damping;\n        return this;\n    }\n\n    /**\n     * Sets the gravity scale of the particles.\n     */\n    public setGravityScale(scale: number): SoftBodyDesc {\n        this.gravityScale = scale;\n        return this;\n    }\n\n    /**\n     * Sets the extra solver substeps requested for the body and everything it touches.\n     */\n    public setAdditionalSolverIterations(iterations: number): SoftBodyDesc {\n        this.additionalSolverIterations = iterations;\n        return this;\n    }\n\n    /**\n     * Sets the extra internal PGS iterations per substep for the body and everything it\n     * touches (default: `3`).\n     */\n    public setAdditionalPgsIterations(iterations: number): SoftBodyDesc {\n        this.additionalPgsIterations = iterations;\n        return this;\n    }\n\n    /**\n     * Sets whether the body may fall asleep.\n     */\n    public setCanSleep(canSleep: boolean): SoftBodyDesc {\n        this.canSleep = canSleep;\n        return this;\n    }\n\n    /**\n     * Sets the dominance group of the body.\n     */\n    public setDominanceGroup(group: number): SoftBodyDesc {\n        this.dominanceGroup = group;\n        return this;\n    }\n\n    /**\n     * Sets the user data associated with the soft body.\n     */\n    public setUserData(data: unknown): SoftBodyDesc {\n        this.userData = data;\n        return this;\n    }\n\n    /**\n     * Appends the particles and elements of another description to this one.\n     */\n    public append(other: SoftBodyDesc): SoftBodyDesc {\n        this.setters.push((raw) => {\n            let rawOther = other.intoRaw();\n            raw.append(rawOther);\n            rawOther.free();\n        });\n        return this;\n    }\n\n    /**\n     * Builds the WASM-side builder this description stands for. The result must be freed.\n     * @internal\n     */\n    public intoRaw(): RawSoftBodyBuilder {\n        let raw = this.generator();\n        for (let setter of this.setters) {\n            setter(raw);\n        }\n        if (this.material) {\n            let rawMaterial = this.material.intoRaw();\n            raw.setMaterial(rawMaterial);\n            rawMaterial.free();\n        }\n        if (this.softness) {\n            raw.setSoftness(\n                this.softness.naturalFrequency,\n                this.softness.dampingRatio,\n            );\n        }\n        if (this.masses) {\n            raw.setMasses(this.masses);\n        } else {\n            raw.setParticleMass(this.particleMass);\n        }\n        if (this.mass !== null) {\n            raw.setMass(this.mass);\n        }\n        raw.setPinnedParticles(this.pinnedParticles);\n        raw.setCellModel(this.cellModel as number as RawSoftBodyCellModel);\n        raw.setSolver(this.solver as number as RawSoftBodySolver);\n        // The settings a generator may have chosen are only overridden when set here.\n        if (this.volumePreservation !== null) {\n            raw.setVolumePreservation(this.volumePreservation);\n        }\n        raw.setVolumeFactor(this.volumeFactor);\n        if (this.shapeMatching !== null) {\n            raw.setShapeMatching(this.shapeMatching);\n        }\n        raw.setSelfContacts(this.selfContacts);\n        if (this.oriented !== null) {\n            raw.setOriented(this.oriented);\n        }\n        if (this.particleRadius !== null) {\n            raw.setParticleRadius(this.particleRadius);\n        }\n        raw.setSkinCollision(this.skinCollision);\n        if (this.surfaceCollider) {\n            let c = this.surfaceCollider;\n            raw.setSurfaceCollider(\n                c.friction,\n                c.restitution,\n                c.frictionCombineRule,\n                c.restitutionCombineRule,\n                c.isSensor,\n                c.collisionGroups,\n                c.solverGroups,\n                c.activeCollisionTypes,\n                c.activeHooks,\n                c.activeEvents,\n                c.contactForceEventThreshold,\n                c.contactSkin,\n            );\n        } else {\n            raw.setNoSurfaceCollider();\n        }\n        if (this.translation) {\n            let rawTra = VectorOps.intoRaw(this.translation);\n            raw.translated(rawTra);\n            rawTra.free();\n        }\n        raw.setLinearDamping(this.linearDamping);\n        raw.setGravityScale(this.gravityScale);\n        raw.setAdditionalSolverIterations(this.additionalSolverIterations);\n        raw.setAdditionalPgsIterations(this.additionalPgsIterations);\n        raw.setCanSleep(this.canSleep);\n        raw.setDominanceGroup(this.dominanceGroup);\n        return raw;\n    }\n\n    /**\n     * The number of particles the description currently generates.\n     */\n    public numParticles(): number {\n        let raw = this.intoRaw();\n        let n = raw.numParticles();\n        raw.free();\n        return n;\n    }\n\n    /**\n     * The flattened world-space positions of the particles the description generates.\n     */\n    public particlePositions(): Float32Array {\n        let raw = this.intoRaw();\n        let positions = raw.particlePositions();\n        raw.free();\n        return positions;\n    }\n}\n\n/**\n * The record of a soft body tearing: the elements it lost, the particles the tear split,\n * the pieces the tear separated into soft bodies of their own, and the clusters and joints\n * that moved with them.\n *\n * Events drained from an `EventQueue` are only valid inside the draining closure; events\n * returned by `World.tearSoftBody` and `World.cutSoftBody` must be freed with `.free()`.\n */\nexport class SoftBodyTearEvent {\n    raw: RawSoftBodyTearEvent;\n\n    constructor(raw?: RawSoftBodyTearEvent) {\n        this.raw = raw;\n    }\n\n    public free() {\n        if (!!this.raw) {\n            this.raw.free();\n        }\n        this.raw = undefined;\n    }\n\n    /**\n     * The soft body that tore.\n     */\n    public softBody(): SoftBodyHandle {\n        return this.raw.softBody();\n    }\n\n    /**\n     * The particle pairs of the edges that tore, flattened.\n     */\n    public tornEdges(): Uint32Array {\n        return this.raw.tornEdges();\n    }\n\n    /**\n     * The particles of the cells that tore, flattened.\n     */\n    public tornCells(): Uint32Array {\n        return this.raw.tornCells();\n    }\n\n    /**\n     * The particle pairs of the edges the tear removed, flattened.\n     */\n    public removedEdges(): Uint32Array {\n        return this.raw.removedEdges();\n    }\n\n    /**\n     * The particles the tear split, flattened as `(original, copy)` pairs.\n     */\n    public splitParticles(): Uint32Array {\n        return this.raw.splitParticles();\n    }\n\n    /**\n     * The particles the tear inserted.\n     */\n    public insertedParticles(): Uint32Array {\n        return this.raw.insertedParticles();\n    }\n\n    /**\n     * The particle pairs (flattened) the tear started from.\n     */\n    public seeds(): Uint32Array {\n        return this.raw.seeds();\n    }\n\n    /**\n     * The number of pieces the tear split off into soft bodies of their own.\n     */\n    public numPieces(): number {\n        return this.raw.numPieces();\n    }\n\n    /**\n     * The soft body the `i`-th piece became.\n     */\n    public pieceSoftBody(i: number): SoftBodyHandle {\n        return this.raw.pieceSoftBody(i);\n    }\n\n    /**\n     * The particles (indices in the torn body) that went into the `i`-th piece.\n     */\n    public pieceParticles(i: number): Uint32Array {\n        return this.raw.pieceParticles(i);\n    }\n\n    /**\n     * The clusters that moved into the `i`-th piece, flattened as `(source, destination)`\n     * index pairs.\n     */\n    public pieceClusters(i: number): Uint32Array {\n        return this.raw.pieceClusters(i);\n    }\n\n    /**\n     * The number of clusters the tear split.\n     */\n    public numClusterSplits(): number {\n        return this.raw.numClusterSplits();\n    }\n\n    /**\n     * The cluster of the torn body the `i`-th split came from.\n     */\n    public clusterSplitSource(i: number): number {\n        return this.raw.clusterSplitSource(i);\n    }\n\n    /**\n     * The soft body holding the cluster the `i`-th split created.\n     */\n    public clusterSplitSoftBody(i: number): SoftBodyHandle {\n        return this.raw.clusterSplitSoftBody(i);\n    }\n\n    /**\n     * The index of the cluster the `i`-th split created.\n     */\n    public clusterSplitCluster(i: number): number {\n        return this.raw.clusterSplitCluster(i);\n    }\n\n    /**\n     * The proxy rigid body of the cluster the `i`-th split created.\n     */\n    public clusterSplitProxy(i: number): RigidBodyHandle {\n        return this.raw.clusterSplitProxy(i);\n    }\n\n    /**\n     * Does the cluster the `i`-th split created keep the source cluster's proxy?\n     */\n    public clusterSplitKeepsProxy(i: number): boolean {\n        return this.raw.clusterSplitKeepsProxy(i);\n    }\n\n    /**\n     * The number of impulse joints the tear moved to another proxy.\n     */\n    public numMovedJoints(): number {\n        return this.raw.numMovedJoints();\n    }\n\n    /**\n     * The `i`-th moved impulse joint.\n     */\n    public movedJoint(i: number): number {\n        return this.raw.movedJoint(i);\n    }\n\n    /**\n     * The proxy the `i`-th moved joint was attached to before the tear.\n     */\n    public movedJointFrom(i: number): RigidBodyHandle {\n        return this.raw.movedJointFrom(i);\n    }\n\n    /**\n     * The proxy the `i`-th moved joint is attached to after the tear.\n     */\n    public movedJointTo(i: number): RigidBodyHandle {\n        return this.raw.movedJointTo(i);\n    }\n\n    /**\n     * Where a particle of the torn body is after the tear: its soft body and index there, or\n     * `null` if the particle was removed.\n     */\n    public particleDestination(\n        particle: number,\n    ): {softBody: SoftBodyHandle; particle: number} | null {\n        let body = this.raw.particleDestinationBody(particle);\n        let index = this.raw.particleDestinationIndex(particle);\n        if (body === undefined || index === undefined) {\n            return null;\n        }\n        return {softBody: body, particle: index};\n    }\n}\n","import {Rotation, Vector, VectorOps, RotationOps, scratchBuffer} from \"../math\";\nimport {\n    RawGenericJoint,\n    RawImpulseJointSet,\n    RawRigidBodySet,\n    RawJointAxis,\n    RawJointType,\n    RawMotorModel,\n} from \"../raw\";\nimport {RigidBody, RigidBodyHandle} from \"./rigid_body\";\nimport {RigidBodySet} from \"./rigid_body_set\";\n// #if DIM3\nimport {Quaternion} from \"../math\";\n// #endif\n\n/**\n * The integer identifier of a collider added to a `ColliderSet`.\n */\nexport type ImpulseJointHandle = number;\n\n/**\n * An enum grouping all possible types of joints:\n *\n * - `Revolute`: A revolute joint that removes all degrees of freedom between the affected\n *               bodies except for the rotation along one axis.\n * - `Fixed`: A fixed joint that removes all relative degrees of freedom between the affected bodies.\n * - `Prismatic`: A prismatic joint that removes all degrees of freedom between the affected\n *                bodies except for the translation along one axis.\n * - `Spherical`: (3D only) A spherical joint that removes all relative linear degrees of freedom between the affected bodies.\n * - `Generic`: (3D only) A joint with customizable degrees of freedom, allowing any of the 6 axes to be locked.\n */\nexport enum JointType {\n    Revolute,\n    Fixed,\n    Prismatic,\n    Rope,\n    Spring,\n    // #if DIM3\n    Spherical,\n    Generic,\n    // #endif\n}\n\nexport enum MotorModel {\n    AccelerationBased,\n    ForceBased,\n}\n\n/**\n * An enum representing a single joint axis, used to configure per-axis joint\n * properties like the motors of a spherical joint.\n */\n// #if DIM3\nexport enum JointAxis {\n    LinX,\n    LinY,\n    LinZ,\n    AngX,\n    AngY,\n    AngZ,\n}\n// #endif\n\n/**\n * An enum representing the possible joint axes of a generic joint.\n * They can be ORed together, like:\n * JointAxesMask.LinX || JointAxesMask.LinY\n * to get a joint that is only free in the X and Y translational (positional) axes.\n *\n * Possible free axes are:\n *\n * - `X`: X translation axis\n * - `Y`: Y translation axis\n * - `Z`: Z translation axis\n * - `AngX`: X angular rotation axis\n * - `AngY`: Y angular rotations axis\n * - `AngZ`: Z angular rotation axis\n */\nexport enum JointAxesMask {\n    LinX = 1 << 0,\n    LinY = 1 << 1,\n    LinZ = 1 << 2,\n    AngX = 1 << 3,\n    AngY = 1 << 4,\n    AngZ = 1 << 5,\n}\n\nexport class ImpulseJoint {\n    protected rawSet: RawImpulseJointSet; // The ImpulseJoint won't need to free this.\n    protected bodySet: RigidBodySet; // The ImpulseJoint won’t need to free this.\n    handle: ImpulseJointHandle;\n\n    constructor(\n        rawSet: RawImpulseJointSet,\n        bodySet: RigidBodySet,\n        handle: ImpulseJointHandle,\n    ) {\n        this.rawSet = rawSet;\n        this.bodySet = bodySet;\n        this.handle = handle;\n    }\n\n    public static newTyped(\n        rawSet: RawImpulseJointSet,\n        bodySet: RigidBodySet,\n        handle: ImpulseJointHandle,\n    ): ImpulseJoint {\n        switch (rawSet.jointType(handle)) {\n            case RawJointType.Revolute:\n                return new RevoluteImpulseJoint(rawSet, bodySet, handle);\n            case RawJointType.Prismatic:\n                return new PrismaticImpulseJoint(rawSet, bodySet, handle);\n            case RawJointType.Fixed:\n                return new FixedImpulseJoint(rawSet, bodySet, handle);\n            case RawJointType.Spring:\n                return new SpringImpulseJoint(rawSet, bodySet, handle);\n            case RawJointType.Rope:\n                return new RopeImpulseJoint(rawSet, bodySet, handle);\n            // #if DIM3\n            case RawJointType.Spherical:\n                return new SphericalImpulseJoint(rawSet, bodySet, handle);\n            case RawJointType.Generic:\n                return new GenericImpulseJoint(rawSet, bodySet, handle);\n            // #endif\n            default:\n                return new ImpulseJoint(rawSet, bodySet, handle);\n        }\n    }\n\n    /** @internal */\n    public finalizeDeserialization(bodySet: RigidBodySet) {\n        this.bodySet = bodySet;\n    }\n\n    /**\n     * Checks if this joint is still valid (i.e. that it has\n     * not been deleted from the joint set yet).\n     */\n    public isValid(): boolean {\n        return this.rawSet.contains(this.handle);\n    }\n\n    /**\n     * The first rigid-body this joint it attached to.\n     */\n    public body1(): RigidBody {\n        return this.bodySet.get(this.rawSet.jointBodyHandle1(this.handle));\n    }\n\n    /**\n     * The second rigid-body this joint is attached to.\n     */\n    public body2(): RigidBody {\n        return this.bodySet.get(this.rawSet.jointBodyHandle2(this.handle));\n    }\n\n    /**\n     * The type of this joint given as a string.\n     */\n    public type(): JointType {\n        return this.rawSet.jointType(this.handle) as number as JointType;\n    }\n\n    // #if DIM3\n    /**\n     * The rotation quaternion that aligns this joint's first local axis to the `x` axis.\n     *\n     * @param {Rotation?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public frameX1(target?: Rotation): Rotation {\n        this.rawSet.jointFrameX1(this.handle, scratchBuffer);\n        return RotationOps.fromBuffer(scratchBuffer, target);\n    }\n\n    // #endif\n\n    // #if DIM3\n    /**\n     * The rotation matrix that aligns this joint's second local axis to the `x` axis.\n     *\n     * @param {Rotation?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public frameX2(target?: Rotation): Rotation {\n        this.rawSet.jointFrameX2(this.handle, scratchBuffer);\n        return RotationOps.fromBuffer(scratchBuffer, target);\n    }\n\n    // #endif\n\n    /**\n     * The position of the first anchor of this joint.\n     *\n     * The first anchor gives the position of the application point on the\n     * local frame of the first rigid-body it is attached to.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public anchor1(target?: Vector): Vector {\n        this.rawSet.jointAnchor1(this.handle, scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n    /**\n     * The position of the second anchor of this joint.\n     *\n     * The second anchor gives the position of the application point on the\n     * local frame of the second rigid-body it is attached to.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public anchor2(target?: Vector): Vector {\n        this.rawSet.jointAnchor2(this.handle, scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n    /**\n     * Sets the position of the first anchor of this joint.\n     *\n     * The first anchor gives the position of the application point on the\n     * local frame of the first rigid-body it is attached to.\n     */\n    public setAnchor1(newPos: Vector) {\n        const rawPoint = VectorOps.intoRaw(newPos);\n        this.rawSet.jointSetAnchor1(this.handle, rawPoint);\n        rawPoint.free();\n    }\n\n    /**\n     * Sets the position of the second anchor of this joint.\n     *\n     * The second anchor gives the position of the application point on the\n     * local frame of the second rigid-body it is attached to.\n     */\n    public setAnchor2(newPos: Vector) {\n        const rawPoint = VectorOps.intoRaw(newPos);\n        this.rawSet.jointSetAnchor2(this.handle, rawPoint);\n        rawPoint.free();\n    }\n\n    // #if DIM3\n    /**\n     * Sets the rotation quaternion that aligns this joint's first local axis to the `x` axis.\n     */\n    public setFrameX1(rot: Rotation) {\n        const rawRot = RotationOps.intoRaw(rot);\n        this.rawSet.jointSetFrameX1(this.handle, rawRot);\n        rawRot.free();\n    }\n\n    /**\n     * Sets the rotation quaternion that aligns this joint's second local axis to the `x` axis.\n     */\n    public setFrameX2(rot: Rotation) {\n        const rawRot = RotationOps.intoRaw(rot);\n        this.rawSet.jointSetFrameX2(this.handle, rawRot);\n        rawRot.free();\n    }\n\n    /**\n     * Sets the full local frame (anchor position and rotation) for the first rigid-body attachment.\n     */\n    public setLocalFrame1(anchor: Vector, rot: Rotation) {\n        const rawAnchor = VectorOps.intoRaw(anchor);\n        const rawRot = RotationOps.intoRaw(rot);\n        this.rawSet.jointSetLocalFrame1(this.handle, rawAnchor, rawRot);\n        rawAnchor.free();\n        rawRot.free();\n    }\n\n    /**\n     * Sets the full local frame (anchor position and rotation) for the second rigid-body attachment.\n     */\n    public setLocalFrame2(anchor: Vector, rot: Rotation) {\n        const rawAnchor = VectorOps.intoRaw(anchor);\n        const rawRot = RotationOps.intoRaw(rot);\n        this.rawSet.jointSetLocalFrame2(this.handle, rawAnchor, rawRot);\n        rawAnchor.free();\n        rawRot.free();\n    }\n    // #endif\n\n    /**\n     * Controls whether contacts are computed between colliders attached\n     * to the rigid-bodies linked by this joint.\n     */\n    public setContactsEnabled(enabled: boolean) {\n        this.rawSet.jointSetContactsEnabled(this.handle, enabled);\n    }\n\n    /**\n     * Indicates if contacts are enabled between colliders attached\n     * to the rigid-bodies linked by this joint.\n     */\n    public contactsEnabled(): boolean {\n        return this.rawSet.jointContactsEnabled(this.handle);\n    }\n}\n\nexport class UnitImpulseJoint extends ImpulseJoint {\n    /**\n     * The axis left free by this joint.\n     */\n    protected rawAxis?(): RawJointAxis;\n\n    /**\n     * Are the limits enabled for this joint?\n     */\n    public limitsEnabled(): boolean {\n        return this.rawSet.jointLimitsEnabled(this.handle, this.rawAxis());\n    }\n\n    /**\n     * The min limit of this joint.\n     */\n    public limitsMin(): number {\n        return this.rawSet.jointLimitsMin(this.handle, this.rawAxis());\n    }\n\n    /**\n     * The max limit of this joint.\n     */\n    public limitsMax(): number {\n        return this.rawSet.jointLimitsMax(this.handle, this.rawAxis());\n    }\n\n    /**\n     * Sets the limits of this joint.\n     *\n     * @param min - The minimum bound of this joint’s free coordinate.\n     * @param max - The maximum bound of this joint’s free coordinate.\n     */\n    public setLimits(min: number, max: number) {\n        this.rawSet.jointSetLimits(this.handle, this.rawAxis(), min, max);\n    }\n\n    public configureMotorModel(model: MotorModel) {\n        this.rawSet.jointConfigureMotorModel(\n            this.handle,\n            this.rawAxis(),\n            model as number as RawMotorModel,\n        );\n    }\n\n    public setMotorMaxForce(maxForce: number) {\n        this.rawSet.jointSetMotorMaxForce(\n            this.handle,\n            this.rawAxis(),\n            maxForce,\n        );\n    }\n\n    public configureMotorVelocity(targetVel: number, factor: number) {\n        this.rawSet.jointConfigureMotorVelocity(\n            this.handle,\n            this.rawAxis(),\n            targetVel,\n            factor,\n        );\n    }\n\n    public configureMotorPosition(\n        targetPos: number,\n        stiffness: number,\n        damping: number,\n    ) {\n        this.rawSet.jointConfigureMotorPosition(\n            this.handle,\n            this.rawAxis(),\n            targetPos,\n            stiffness,\n            damping,\n        );\n    }\n\n    public configureMotor(\n        targetPos: number,\n        targetVel: number,\n        stiffness: number,\n        damping: number,\n    ) {\n        this.rawSet.jointConfigureMotor(\n            this.handle,\n            this.rawAxis(),\n            targetPos,\n            targetVel,\n            stiffness,\n            damping,\n        );\n    }\n}\n\nexport class FixedImpulseJoint extends ImpulseJoint {}\n\nexport class RopeImpulseJoint extends ImpulseJoint {}\n\nexport class SpringImpulseJoint extends ImpulseJoint {}\n\nexport class PrismaticImpulseJoint extends UnitImpulseJoint {\n    public rawAxis(): RawJointAxis {\n        return RawJointAxis.LinX;\n    }\n}\n\nexport class RevoluteImpulseJoint extends UnitImpulseJoint {\n    public rawAxis(): RawJointAxis {\n        return RawJointAxis.AngX;\n    }\n}\n\n// #if DIM3\nexport class GenericImpulseJoint extends ImpulseJoint {}\n\nexport class SphericalImpulseJoint extends ImpulseJoint {\n    /**\n     * Sets the motor model of one of this joint's angular axes.\n     *\n     * @param axis - The angular axis (`JointAxis.AngX/AngY/AngZ`) to configure.\n     * @param model - The motor model to apply to that axis.\n     */\n    public configureMotorModel(axis: JointAxis, model: MotorModel) {\n        this.rawSet.jointConfigureMotorModel(\n            this.handle,\n            axis as number as RawJointAxis,\n            model as number as RawMotorModel,\n        );\n    }\n\n    /**\n     * Sets the maximum force/torque the motor of the given angular axis can deliver.\n     *\n     * @param axis - The angular axis (`JointAxis.AngX/AngY/AngZ`) to configure.\n     * @param maxForce - The maximum torque the axis motor can deliver.\n     */\n    public setMotorMaxForce(axis: JointAxis, maxForce: number) {\n        this.rawSet.jointSetMotorMaxForce(\n            this.handle,\n            axis as number as RawJointAxis,\n            maxForce,\n        );\n    }\n\n    /**\n     * Makes the motor of the given angular axis target a specific angular velocity.\n     *\n     * @param axis - The angular axis (`JointAxis.AngX/AngY/AngZ`) to configure.\n     * @param targetVel - The target angular velocity along the axis, in radians per second.\n     * @param factor - The strength used to reach the target velocity (a damping coefficient).\n     */\n    public configureMotorVelocity(\n        axis: JointAxis,\n        targetVel: number,\n        factor: number,\n    ) {\n        this.rawSet.jointConfigureMotorVelocity(\n            this.handle,\n            axis as number as RawJointAxis,\n            targetVel,\n            factor,\n        );\n    }\n\n    /**\n     * Makes the motor of the given angular axis target a specific angle.\n     *\n     * @param axis - The angular axis (`JointAxis.AngX/AngY/AngZ`) to configure.\n     * @param targetPos - The target angle along the axis, in radians.\n     * @param stiffness - The spring-like stiffness used to reach the target angle.\n     * @param damping - The damping applied to the axis' angular velocity.\n     */\n    public configureMotorPosition(\n        axis: JointAxis,\n        targetPos: number,\n        stiffness: number,\n        damping: number,\n    ) {\n        this.rawSet.jointConfigureMotorPosition(\n            this.handle,\n            axis as number as RawJointAxis,\n            targetPos,\n            stiffness,\n            damping,\n        );\n    }\n\n    /**\n     * Configures the motor of the given angular axis with both an angle and an\n     * angular-velocity target.\n     *\n     * @param axis - The angular axis (`JointAxis.AngX/AngY/AngZ`) to configure.\n     * @param targetPos - The target angle along the axis, in radians.\n     * @param targetVel - The target angular velocity along the axis, in radians per second.\n     * @param stiffness - The spring-like stiffness used to reach the target angle.\n     * @param damping - The damping applied to the axis' angular velocity.\n     */\n    public configureMotor(\n        axis: JointAxis,\n        targetPos: number,\n        targetVel: number,\n        stiffness: number,\n        damping: number,\n    ) {\n        this.rawSet.jointConfigureMotor(\n            this.handle,\n            axis as number as RawJointAxis,\n            targetPos,\n            targetVel,\n            stiffness,\n            damping,\n        );\n    }\n}\n// #endif\n\nexport class JointData {\n    anchor1: Vector;\n    anchor2: Vector;\n    axis: Vector;\n    // #if DIM3\n    axis1: Vector;\n    axis2: Vector;\n    // #endif\n    frame1: Rotation;\n    frame2: Rotation;\n    jointType: JointType;\n    limitsEnabled: boolean;\n    limits: Array<number>;\n    axesMask: JointAxesMask;\n    stiffness: number;\n    damping: number;\n    length: number;\n\n    private constructor() {}\n\n    /**\n     * Creates a new joint descriptor that builds a Fixed joint.\n     *\n     * A fixed joint removes all the degrees of freedom between the affected bodies, ensuring their\n     * anchor and local frames coincide in world-space.\n     *\n     * @param anchor1 - Point where the joint is attached on the first rigid-body affected by this joint. Expressed in the\n     *                  local-space of the rigid-body.\n     * @param frame1 - The reference orientation of the joint wrt. the first rigid-body.\n     * @param anchor2 - Point where the joint is attached on the second rigid-body affected by this joint. Expressed in the\n     *                  local-space of the rigid-body.\n     * @param frame2 - The reference orientation of the joint wrt. the second rigid-body.\n     */\n    public static fixed(\n        anchor1: Vector,\n        frame1: Rotation,\n        anchor2: Vector,\n        frame2: Rotation,\n    ): JointData {\n        let res = new JointData();\n        res.anchor1 = anchor1;\n        res.anchor2 = anchor2;\n        res.frame1 = frame1;\n        res.frame2 = frame2;\n        res.jointType = JointType.Fixed;\n        return res;\n    }\n\n    public static spring(\n        rest_length: number,\n        stiffness: number,\n        damping: number,\n        anchor1: Vector,\n        anchor2: Vector,\n    ): JointData {\n        let res = new JointData();\n        res.anchor1 = anchor1;\n        res.anchor2 = anchor2;\n        res.length = rest_length;\n        res.stiffness = stiffness;\n        res.damping = damping;\n        res.jointType = JointType.Spring;\n        return res;\n    }\n\n    public static rope(\n        length: number,\n        anchor1: Vector,\n        anchor2: Vector,\n    ): JointData {\n        let res = new JointData();\n        res.anchor1 = anchor1;\n        res.anchor2 = anchor2;\n        res.length = length;\n        res.jointType = JointType.Rope;\n        return res;\n    }\n\n\n    // #if DIM3\n    /**\n     * Create a new joint descriptor that builds generic joints.\n     *\n     * A generic joint allows customizing its degrees of freedom\n     * by supplying a mask of the joint axes that should remain locked.\n     *\n     * @param anchor1 - Point where the joint is attached on the first rigid-body affected by this joint. Expressed in the\n     *                  local-space of the rigid-body.\n     * @param anchor2 - Point where the joint is attached on the second rigid-body affected by this joint. Expressed in the\n     *                  local-space of the rigid-body.\n     * @param axis - The X axis of the joint, expressed in the local-space of the rigid-bodies it is attached to.\n     * @param axesMask - Mask representing the locked axes of the joint. You can use logical OR to select these from\n     *                   the JointAxesMask enum. For example, passing (JointAxesMask.AngX || JointAxesMask.AngY) will\n     *                   create a joint locked in the X and Y rotational axes.\n     */\n    public static generic(\n        anchor1: Vector,\n        anchor2: Vector,\n        axis: Vector,\n        axesMask: JointAxesMask,\n    ): JointData {\n        let res = new JointData();\n        res.anchor1 = anchor1;\n        res.anchor2 = anchor2;\n        res.axis = axis;\n        res.axesMask = axesMask;\n        res.jointType = JointType.Generic;\n        return res;\n    }\n\n    /**\n     * Create a new joint descriptor that builds spherical joints.\n     *\n     * A spherical joint allows three relative rotational degrees of freedom\n     * by preventing any relative translation between the anchors of the\n     * two attached rigid-bodies.\n     *\n     * @param anchor1 - Point where the joint is attached on the first rigid-body affected by this joint. Expressed in the\n     *                  local-space of the rigid-body.\n     * @param anchor2 - Point where the joint is attached on the second rigid-body affected by this joint. Expressed in the\n     *                  local-space of the rigid-body.\n     */\n    public static spherical(anchor1: Vector, anchor2: Vector): JointData {\n        let res = new JointData();\n        res.anchor1 = anchor1;\n        res.anchor2 = anchor2;\n        res.jointType = JointType.Spherical;\n        return res;\n    }\n\n    /**\n     * Creates a new joint descriptor that builds a Prismatic joint.\n     *\n     * A prismatic joint removes all the degrees of freedom between the\n     * affected bodies, except for the translation along one axis.\n     *\n     * @param anchor1 - Point where the joint is attached on the first rigid-body affected by this joint. Expressed in the\n     *                  local-space of the rigid-body.\n     * @param anchor2 - Point where the joint is attached on the second rigid-body affected by this joint. Expressed in the\n     *                  local-space of the rigid-body.\n     * @param axis - Axis of the joint, expressed in the local-space of the rigid-bodies it is attached to.\n     */\n    public static prismatic(\n        anchor1: Vector,\n        anchor2: Vector,\n        axis: Vector,\n    ): JointData {\n        let res = new JointData();\n        res.anchor1 = anchor1;\n        res.anchor2 = anchor2;\n        res.axis = axis;\n        res.jointType = JointType.Prismatic;\n        return res;\n    }\n\n    /**\n     * Create a new joint descriptor that builds Revolute joints.\n     *\n     * A revolute joint removes all degrees of freedom between the affected\n     * bodies except for the rotation along one axis.\n     *\n     * @param anchor1 - Point where the joint is attached on the first rigid-body affected by this joint. Expressed in the\n     *                  local-space of the rigid-body.\n     * @param anchor2 - Point where the joint is attached on the second rigid-body affected by this joint. Expressed in the\n     *                  local-space of the rigid-body.\n     * @param axis - Axis of the joint, expressed in the local-space of the rigid-bodies it is attached to.\n     */\n    public static revolute(\n        anchor1: Vector,\n        anchor2: Vector,\n        axis: Vector,\n    ): JointData {\n        let res = new JointData();\n        res.anchor1 = anchor1;\n        res.anchor2 = anchor2;\n        res.axis = axis;\n        res.jointType = JointType.Revolute;\n        return res;\n    }\n\n    /**\n     * Create a new joint descriptor that builds Revolute joints with independent\n     * local axes for each attached rigid-body.\n     *\n     * This is useful when the same world-space hinge axis is represented by\n     * different local axes on the two bodies.\n     *\n     * @param anchor1 - Point where the joint is attached on the first rigid-body affected by this joint. Expressed in the\n     *                  local-space of the rigid-body.\n     * @param anchor2 - Point where the joint is attached on the second rigid-body affected by this joint. Expressed in the\n     *                  local-space of the rigid-body.\n     * @param axis1 - Axis of the joint, expressed in the local-space of the first rigid-body.\n     * @param axis2 - Axis of the joint, expressed in the local-space of the second rigid-body.\n     */\n    public static revoluteWithAxes(\n        anchor1: Vector,\n        anchor2: Vector,\n        axis1: Vector,\n        axis2: Vector,\n    ): JointData {\n        let res = new JointData();\n        res.anchor1 = anchor1;\n        res.anchor2 = anchor2;\n        res.axis = axis1;\n        res.axis1 = axis1;\n        res.axis2 = axis2;\n        res.jointType = JointType.Revolute;\n        return res;\n    }\n    // #endif\n\n    public intoRaw(): RawGenericJoint {\n        let rawA1 = VectorOps.intoRaw(this.anchor1);\n        let rawA2 = VectorOps.intoRaw(this.anchor2);\n        let rawAx;\n        let result;\n        let limitsEnabled = false;\n        let limitsMin = 0.0;\n        let limitsMax = 0.0;\n\n        switch (this.jointType) {\n            case JointType.Fixed:\n                let rawFra1 = RotationOps.intoRaw(this.frame1);\n                let rawFra2 = RotationOps.intoRaw(this.frame2);\n                result = RawGenericJoint.fixed(rawA1, rawFra1, rawA2, rawFra2);\n                rawFra1.free();\n                rawFra2.free();\n                break;\n            case JointType.Spring:\n                result = RawGenericJoint.spring(\n                    this.length,\n                    this.stiffness,\n                    this.damping,\n                    rawA1,\n                    rawA2,\n                );\n                break;\n            case JointType.Rope:\n                result = RawGenericJoint.rope(this.length, rawA1, rawA2);\n                break;\n            case JointType.Prismatic:\n                rawAx = VectorOps.intoRaw(this.axis);\n\n                if (!!this.limitsEnabled) {\n                    limitsEnabled = true;\n                    limitsMin = this.limits[0];\n                    limitsMax = this.limits[1];\n                }\n\n\n                // #if DIM3\n                result = RawGenericJoint.prismatic(\n                    rawA1,\n                    rawA2,\n                    rawAx,\n                    limitsEnabled,\n                    limitsMin,\n                    limitsMax,\n                );\n                // #endif\n\n                rawAx.free();\n                break;\n            // #if DIM3\n            case JointType.Generic:\n                rawAx = VectorOps.intoRaw(this.axis);\n                // implicit type cast: axesMask is a JointAxesMask bitflag enum,\n                // we're treating it as a u8 on the Rust side\n                let rawAxesMask = this.axesMask;\n                result = RawGenericJoint.generic(\n                    rawA1,\n                    rawA2,\n                    rawAx,\n                    rawAxesMask,\n                );\n                break;\n            case JointType.Spherical:\n                result = RawGenericJoint.spherical(rawA1, rawA2);\n                break;\n            case JointType.Revolute:\n                if (!!this.axis1 && !!this.axis2) {\n                    let rawAx1 = VectorOps.intoRaw(this.axis1);\n                    let rawAx2 = VectorOps.intoRaw(this.axis2);\n                    result = RawGenericJoint.revoluteWithAxes(\n                        rawA1,\n                        rawA2,\n                        rawAx1,\n                        rawAx2,\n                    );\n                    rawAx1.free();\n                    rawAx2.free();\n                } else {\n                    rawAx = VectorOps.intoRaw(this.axis);\n                    result = RawGenericJoint.revolute(rawA1, rawA2, rawAx);\n                    rawAx.free();\n                }\n                break;\n            // #endif\n        }\n\n        rawA1.free();\n        rawA2.free();\n\n        return result;\n    }\n}\n","/**\n * A rule applied to combine coefficients.\n *\n * Use this when configuring the `ColliderDesc` to specify\n * how friction and restitution coefficient should be combined\n * in a contact.\n */\nexport enum CoefficientCombineRule {\n    Average = 0,\n    Min = 1,\n    Multiply = 2,\n    Max = 3,\n}\n","export class Coarena<T> {\n    fconv: Float64Array;\n    uconv: Uint32Array;\n    data: Array<T>;\n    size: number;\n\n    public constructor() {\n        this.fconv = new Float64Array(1);\n        this.uconv = new Uint32Array(this.fconv.buffer);\n        this.data = new Array<T>();\n        this.size = 0;\n    }\n\n    public set(handle: number, data: T) {\n        let i = this.index(handle);\n        while (this.data.length <= i) {\n            this.data.push(null);\n        }\n\n        if (this.data[i] == null) this.size += 1;\n        this.data[i] = data;\n    }\n\n    public len(): number {\n        return this.size;\n    }\n\n    public delete(handle: number) {\n        let i = this.index(handle);\n        if (i < this.data.length) {\n            if (this.data[i] != null) this.size -= 1;\n            this.data[i] = null;\n        }\n    }\n\n    public clear() {\n        this.data = new Array<T>();\n    }\n\n    public get(handle: number): T | null {\n        let i = this.index(handle);\n        if (i < this.data.length) {\n            return this.data[i];\n        } else {\n            return null;\n        }\n    }\n\n    public forEach(f: (elt: T) => void) {\n        for (const elt of this.data) {\n            if (elt != null) f(elt);\n        }\n    }\n\n    public getAll(): Array<T> {\n        return this.data.filter((elt) => elt != null);\n    }\n\n    private index(handle: number): number {\n        /// Extracts the index part of a handle (the lower 32 bits).\n        /// This is done by first injecting the handle into an Float64Array\n        /// which is itself injected into an Uint32Array (at construction time).\n        /// The 0-th value of the Uint32Array will become the `number` integer\n        /// representation of the lower 32 bits.\n        /// Also `this.uconv[1]` then contains the generation number as a `number`,\n        /// which we don’t really need.\n        this.fconv[0] = handle;\n        return this.uconv[0];\n    }\n}\n","import {RawRigidBodySet, RawRigidBodyType} from \"../raw\";\nimport {Coarena} from \"../coarena\";\nimport {VectorOps, RotationOps} from \"../math\";\nimport {\n    RigidBody,\n    RigidBodyDesc,\n    RigidBodyHandle,\n    RigidBodyType,\n} from \"./rigid_body\";\nimport {ColliderSet} from \"../geometry\";\nimport {ImpulseJointSet} from \"./impulse_joint_set\";\nimport {MultibodyJointSet} from \"./multibody_joint_set\";\nimport {IslandManager} from \"./island_manager\";\nimport {SoftBodySet} from \"./soft_body_set\";\n\n/**\n * A set of rigid bodies that can be handled by a physics pipeline.\n *\n * To avoid leaking WASM resources, this MUST be freed manually with `rigidBodySet.free()`\n * once you are done using it (and all the rigid-bodies it created).\n */\nexport class RigidBodySet {\n    raw: RawRigidBodySet;\n    private map: Coarena<RigidBody>;\n\n    /**\n     * Release the WASM memory occupied by this rigid-body set.\n     */\n    public free() {\n        if (!!this.raw) {\n            this.raw.free();\n        }\n        this.raw = undefined;\n\n        if (!!this.map) {\n            this.map.clear();\n        }\n        this.map = undefined;\n    }\n\n    constructor(raw?: RawRigidBodySet) {\n        this.raw = raw || new RawRigidBodySet();\n        this.map = new Coarena<RigidBody>();\n        // deserialize\n        if (raw) {\n            raw.forEachRigidBodyHandle((handle: RigidBodyHandle) => {\n                this.map.set(handle, new RigidBody(raw, null, handle));\n            });\n        }\n    }\n\n    /**\n     * Internal method, do not call this explicitly.\n     */\n    public finalizeDeserialization(colliderSet: ColliderSet) {\n        this.map.forEach((rb) => rb.finalizeDeserialization(colliderSet));\n    }\n\n    /**\n     * Creates a new rigid-body and return its integer handle.\n     *\n     * @param desc - The description of the rigid-body to create.\n     */\n    public createRigidBody(\n        colliderSet: ColliderSet,\n        desc: RigidBodyDesc,\n    ): RigidBody {\n        let rawTra = VectorOps.intoRaw(desc.translation);\n        let rawRot = RotationOps.intoRaw(desc.rotation);\n        let rawLv = VectorOps.intoRaw(desc.linvel);\n        let rawCom = VectorOps.intoRaw(desc.centerOfMass);\n\n        // #if DIM3\n        let rawAv = VectorOps.intoRaw(desc.angvel);\n        let rawPrincipalInertia = VectorOps.intoRaw(\n            desc.principalAngularInertia,\n        );\n        let rawInertiaFrame = RotationOps.intoRaw(\n            desc.angularInertiaLocalFrame,\n        );\n        // #endif\n\n        let handle = this.raw.createRigidBody(\n            desc.enabled,\n            rawTra,\n            rawRot,\n            desc.gravityScale,\n            desc.mass,\n            desc.massOnly,\n            rawCom,\n            rawLv,\n            // #if DIM3\n            rawAv,\n            rawPrincipalInertia,\n            rawInertiaFrame,\n            desc.translationsEnabledX,\n            desc.translationsEnabledY,\n            desc.translationsEnabledZ,\n            desc.rotationsEnabledX,\n            desc.rotationsEnabledY,\n            desc.rotationsEnabledZ,\n            // #endif\n            desc.linearDamping,\n            desc.angularDamping,\n            desc.status as number as RawRigidBodyType,\n            desc.canSleep,\n            desc.sleeping,\n            desc.softCcdPrediction,\n            desc.ccdEnabled,\n            desc.dominanceGroup,\n            desc.additionalSolverIterations,\n            desc.additionalPgsIterations,\n        );\n\n        rawTra.free();\n        rawRot.free();\n        rawLv.free();\n        rawCom.free();\n\n        // #if DIM3\n        rawAv.free();\n        rawPrincipalInertia.free();\n        rawInertiaFrame.free();\n        // #endif\n\n        const body = new RigidBody(this.raw, colliderSet, handle);\n        body.userData = desc.userData;\n\n        this.map.set(handle, body);\n\n        return body;\n    }\n\n    /**\n     * Removes a rigid-body from this set.\n     *\n     * This will also remove all the colliders and joints attached to the rigid-body.\n     *\n     * @param handle - The integer handle of the rigid-body to remove.\n     * @param colliders - The set of colliders that may contain colliders attached to the removed rigid-body.\n     * @param softBodies - The set of soft bodies: removing a cluster proxy removes its cluster.\n     * @param impulseJoints - The set of impulse joints that may contain joints attached to the removed rigid-body.\n     * @param multibodyJoints - The set of multibody joints that may contain joints attached to the removed rigid-body.\n     */\n    public remove(\n        handle: RigidBodyHandle,\n        islands: IslandManager,\n        colliders: ColliderSet,\n        softBodies: SoftBodySet,\n        impulseJoints: ImpulseJointSet,\n        multibodyJoints: MultibodyJointSet,\n    ) {\n        // Unmap the entities that will be removed automatically because of the rigid-body removals.\n        for (let i = 0; i < this.raw.rbNumColliders(handle); i += 1) {\n            colliders.unmap(this.raw.rbCollider(handle, i));\n        }\n\n        impulseJoints.forEachJointHandleAttachedToRigidBody(handle, (handle) =>\n            impulseJoints.unmap(handle),\n        );\n        multibodyJoints.forEachJointHandleAttachedToRigidBody(\n            handle,\n            (handle) => multibodyJoints.unmap(handle),\n        );\n\n        // Remove the rigid-body.\n        this.raw.remove(\n            handle,\n            islands.raw,\n            colliders.raw,\n            softBodies.raw,\n            impulseJoints.raw,\n            multibodyJoints.raw,\n        );\n        this.map.delete(handle);\n        // A cluster proxy takes its cluster's colliders with it.\n        colliders.unmapRemovedColliders();\n    }\n\n    /**\n     * Wraps the rigid-bodies the engine created on its own (the proxies of soft bodies and\n     * their clusters) that have no JavaScript wrapper yet.\n     */\n    public mapNewBodies(colliders: ColliderSet) {\n        this.raw.forEachRigidBodyHandle((handle: RigidBodyHandle) => {\n            if (!this.map.get(handle)) {\n                this.map.set(\n                    handle,\n                    new RigidBody(this.raw, colliders, handle),\n                );\n            }\n        });\n    }\n\n    /**\n     * Drops the wrappers of the rigid-bodies the engine removed on its own (the proxies of\n     * removed soft bodies and clusters).\n     */\n    public unmapRemovedBodies() {\n        for (let body of this.map.getAll()) {\n            if (!this.raw.contains(body.handle)) {\n                this.map.delete(body.handle);\n            }\n        }\n    }\n\n    /**\n     * The number of rigid-bodies on this set.\n     */\n    public len(): number {\n        return this.map.len();\n    }\n\n    /**\n     * Does this set contain a rigid-body with the given handle?\n     *\n     * @param handle - The rigid-body handle to check.\n     */\n    public contains(handle: RigidBodyHandle): boolean {\n        return this.get(handle) != null;\n    }\n\n    /**\n     * Gets the rigid-body with the given handle.\n     *\n     * @param handle - The handle of the rigid-body to retrieve.\n     */\n    public get(handle: RigidBodyHandle): RigidBody | null {\n        return this.map.get(handle);\n    }\n\n    /**\n     * Applies the given closure to each rigid-body contained by this set.\n     *\n     * @param f - The closure to apply.\n     */\n    public forEach(f: (body: RigidBody) => void) {\n        this.map.forEach(f);\n    }\n\n    /**\n     * Applies the given closure to each active rigid-bodies contained by this set.\n     *\n     * A rigid-body is active if it is not sleeping, i.e., if it moved recently.\n     *\n     * @param f - The closure to apply.\n     */\n    public forEachActiveRigidBody(\n        islands: IslandManager,\n        f: (body: RigidBody) => void,\n    ) {\n        islands.forEachActiveRigidBodyHandle((handle) => {\n            f(this.get(handle));\n        });\n    }\n\n    /**\n     * Gets all rigid-bodies in the list.\n     *\n     * @returns rigid-bodies list.\n     */\n    public getAll(): RigidBody[] {\n        return this.map.getAll();\n    }\n}\n","import {Vector, VectorOps, scratchBuffer} from \"../math\";\nimport {\n    RawFeatureType,\n    RawRayColliderIntersection,\n    RawRayColliderHit,\n    RawRayIntersection,\n} from \"../raw\";\nimport {Collider} from \"./collider\";\nimport {FeatureType} from \"./feature\";\nimport {ColliderSet} from \"./collider_set\";\n\n/**\n * A ray. This is a directed half-line.\n */\nexport class Ray {\n    /**\n     * The starting point of the ray.\n     */\n    public origin: Vector;\n    /**\n     * The direction of propagation of the ray.\n     */\n    public dir: Vector;\n\n    /**\n     * Builds a ray from its origin and direction.\n     *\n     * @param origin - The ray's starting point.\n     * @param dir - The ray's direction of propagation.\n     */\n    constructor(origin: Vector, dir: Vector) {\n        this.origin = origin;\n        this.dir = dir;\n    }\n\n    public pointAt(t: number): Vector {\n        return {\n            x: this.origin.x + this.dir.x * t,\n            y: this.origin.y + this.dir.y * t,\n            // #if DIM3\n            z: this.origin.z + this.dir.z * t,\n            // #endif\n        };\n    }\n}\n\n/**\n * The intersection between a ray and a collider.\n */\nexport class RayIntersection {\n    /**\n     * The time-of-impact of the ray with the collider.\n     *\n     * The hit point is obtained from the ray's origin and direction: `origin + dir * timeOfImpact`.\n     */\n    timeOfImpact: number;\n    /**\n     * The normal of the collider at the hit point.\n     */\n    normal: Vector;\n\n    /**\n     * The type of the geometric feature the point was projected on.\n     */\n    featureType = FeatureType.Unknown;\n\n    /**\n     * The id of the geometric feature the point was projected on.\n     */\n    featureId: number | undefined = undefined;\n\n    constructor(\n        timeOfImpact: number,\n        normal: Vector,\n        featureType?: FeatureType,\n        featureId?: number,\n    ) {\n        this.timeOfImpact = timeOfImpact;\n        this.normal = normal;\n        if (featureId !== undefined) this.featureId = featureId;\n        if (featureType !== undefined) this.featureType = featureType;\n    }\n\n    /**\n     * @param raw - The raw intersection returned by the WASM query. It is freed by this method.\n     * @param target - If provided, this object is populated and returned instead of\n     * allocating a new one.\n     */\n    public static fromBuffer(\n        raw: RawRayIntersection,\n        target?: RayIntersection,\n    ): RayIntersection {\n        if (!raw) return null;\n\n        raw.normal(scratchBuffer);\n\n        target ??= new RayIntersection(0, VectorOps.zeros());\n        target.timeOfImpact = raw.time_of_impact();\n        target.normal = VectorOps.fromBuffer(scratchBuffer, target.normal);\n        target.featureType = raw.featureType() as number as FeatureType;\n        target.featureId = raw.featureId();\n\n        raw.free();\n        return target;\n    }\n}\n\n/**\n * The intersection between a ray and a collider (includes the collider handle).\n */\nexport class RayColliderIntersection {\n    /**\n     * The collider hit by the ray.\n     */\n    collider: Collider;\n    /**\n     * The time-of-impact of the ray with the collider.\n     *\n     * The hit point is obtained from the ray's origin and direction: `origin + dir * timeOfImpact`.\n     */\n    timeOfImpact: number;\n    /**\n     * The normal of the collider at the hit point.\n     */\n    normal: Vector;\n\n    /**\n     * The type of the geometric feature the point was projected on.\n     */\n    featureType = FeatureType.Unknown;\n\n    /**\n     * The id of the geometric feature the point was projected on.\n     */\n    featureId: number | undefined = undefined;\n\n    constructor(\n        collider: Collider,\n        timeOfImpact: number,\n        normal: Vector,\n        featureType?: FeatureType,\n        featureId?: number,\n    ) {\n        this.collider = collider;\n        this.timeOfImpact = timeOfImpact;\n        this.normal = normal;\n        if (featureId !== undefined) this.featureId = featureId;\n        if (featureType !== undefined) this.featureType = featureType;\n    }\n\n    /**\n     * @param colliderSet - The set the hit collider belongs to.\n     * @param raw - The raw intersection returned by the WASM query. It is freed by this method.\n     * @param target - If provided, this object is populated and returned instead of\n     * allocating a new one.\n     */\n    public static fromBuffer(\n        colliderSet: ColliderSet,\n        raw: RawRayColliderIntersection,\n        target?: RayColliderIntersection,\n    ): RayColliderIntersection {\n        if (!raw) return null;\n\n        raw.normal(scratchBuffer);\n\n        target ??= new RayColliderIntersection(null, 0, VectorOps.zeros());\n        target.collider = colliderSet.get(raw.colliderHandle());\n        target.timeOfImpact = raw.time_of_impact();\n        target.normal = VectorOps.fromBuffer(scratchBuffer, target.normal);\n        target.featureType = raw.featureType() as number as FeatureType;\n        target.featureId = raw.featureId();\n\n        raw.free();\n        return target;\n    }\n}\n\n/**\n * The time of impact between a ray and a collider.\n */\nexport class RayColliderHit {\n    /**\n     * The handle of the collider hit by the ray.\n     */\n    collider: Collider;\n    /**\n     * The time-of-impact of the ray with the collider.\n     *\n     * The hit point is obtained from the ray's origin and direction: `origin + dir * timeOfImpact`.\n     */\n    timeOfImpact: number;\n\n    constructor(collider: Collider, timeOfImpact: number) {\n        this.collider = collider;\n        this.timeOfImpact = timeOfImpact;\n    }\n\n    public static fromRaw(\n        colliderSet: ColliderSet,\n        raw: RawRayColliderHit,\n    ): RayColliderHit {\n        if (!raw) return null;\n\n        const result = new RayColliderHit(\n            colliderSet.get(raw.colliderHandle()),\n            raw.timeOfImpact(),\n        );\n        raw.free();\n        return result;\n    }\n}\n","import {Collider, ColliderHandle} from \"./collider\";\nimport {Vector, VectorOps, scratchBuffer} from \"../math\";\nimport {\n    RawFeatureType,\n    RawPointColliderProjection,\n    RawPointProjection,\n} from \"../raw\";\nimport {FeatureType} from \"./feature\";\nimport {ColliderSet} from \"./collider_set\";\n\n/**\n * The projection of a point on a collider.\n */\nexport class PointProjection {\n    /**\n     * The projection of the point on the collider.\n     */\n    point: Vector;\n    /**\n     * Is the point inside of the collider?\n     */\n    isInside: boolean;\n\n    constructor(point: Vector, isInside: boolean) {\n        this.point = point;\n        this.isInside = isInside;\n    }\n\n    /**\n     * @param raw - The raw projection returned by the WASM query. It is freed by this method.\n     * @param target - If provided, this object is populated and returned instead of\n     * allocating a new one.\n     */\n    public static fromBuffer(\n        raw: RawPointProjection,\n        target?: PointProjection,\n    ): PointProjection {\n        if (!raw) return null;\n\n        raw.point(scratchBuffer);\n\n        target ??= new PointProjection(VectorOps.zeros(), false);\n        target.point = VectorOps.fromBuffer(scratchBuffer, target.point);\n        target.isInside = raw.isInside();\n\n        raw.free();\n        return target;\n    }\n}\n\n/**\n * The projection of a point on a collider (includes the collider handle).\n */\nexport class PointColliderProjection {\n    /**\n     * The collider hit by the ray.\n     */\n    collider: Collider;\n    /**\n     * The projection of the point on the collider.\n     */\n    point: Vector;\n    /**\n     * Is the point inside of the collider?\n     */\n    isInside: boolean;\n\n    /**\n     * The type of the geometric feature the point was projected on.\n     */\n    featureType = FeatureType.Unknown;\n\n    /**\n     * The id of the geometric feature the point was projected on.\n     */\n    featureId: number | undefined = undefined;\n\n    constructor(\n        collider: Collider,\n        point: Vector,\n        isInside: boolean,\n        featureType?: FeatureType,\n        featureId?: number,\n    ) {\n        this.collider = collider;\n        this.point = point;\n        this.isInside = isInside;\n        if (featureId !== undefined) this.featureId = featureId;\n        if (featureType !== undefined) this.featureType = featureType;\n    }\n\n    /**\n     * @param colliderSet - The set the projected-on collider belongs to.\n     * @param raw - The raw projection returned by the WASM query. It is freed by this method.\n     * @param target - If provided, this object is populated and returned instead of\n     * allocating a new one.\n     */\n    public static fromBuffer(\n        colliderSet: ColliderSet,\n        raw: RawPointColliderProjection,\n        target?: PointColliderProjection,\n    ): PointColliderProjection {\n        if (!raw) return null;\n\n        raw.point(scratchBuffer);\n\n        target ??= new PointColliderProjection(null, VectorOps.zeros(), false);\n        target.collider = colliderSet.get(raw.colliderHandle());\n        target.point = VectorOps.fromBuffer(scratchBuffer, target.point);\n        target.isInside = raw.isInside();\n        target.featureType = raw.featureType() as number as FeatureType;\n        target.featureId = raw.featureId();\n\n        raw.free();\n        return target;\n    }\n}\n","import {Collider} from \"./collider\";\nimport {Vector, VectorOps} from \"../math\";\n\n/**\n * The result of a shape-cast between two shapes, returned by the pairwise casts\n * `Shape.castShape` and `Collider.castShape`.\n *\n * The first shape is the one the cast is called on (the shape or collider `this`), and the\n * second shape is the `shape2` argument. Each witness point and normal is expressed in the\n * local-space of its own shape, i.e., relative to that shape's pose (it does not depend on\n * the shape's translation along the cast).\n */\nexport class ShapeCastHit {\n    /**\n     * The time of impact of the two shapes.\n     */\n    time_of_impact: number;\n    /**\n     * The contact point on the first shape at the time of impact, expressed in the\n     * local-space of the first shape.\n     */\n    witness1: Vector;\n    /**\n     * The contact point on the second shape at the time of impact, expressed in the\n     * local-space of the second shape.\n     */\n    witness2: Vector;\n    /**\n     * The outward normal on the first shape at the time of impact, expressed in the\n     * local-space of the first shape.\n     */\n    normal1: Vector;\n    /**\n     * The outward normal on the second shape at the time of impact, expressed in the\n     * local-space of the second shape.\n     */\n    normal2: Vector;\n\n    constructor(\n        time_of_impact: number,\n        witness1: Vector,\n        witness2: Vector,\n        normal1: Vector,\n        normal2: Vector,\n    ) {\n        this.time_of_impact = time_of_impact;\n        this.witness1 = witness1;\n        this.witness2 = witness2;\n        this.normal1 = normal1;\n        this.normal2 = normal2;\n    }\n\n    public static fromBuffer(\n        collider: Collider,\n        buffer: Float32Array,\n        target?: ShapeCastHit,\n    ): ShapeCastHit {\n        if (!buffer) return null;\n\n        target ??= new ShapeCastHit(\n            0,\n            VectorOps.zeros(),\n            VectorOps.zeros(),\n            VectorOps.zeros(),\n            VectorOps.zeros(),\n        );\n\n        target.time_of_impact = buffer[0];\n\n\n        // #if DIM3\n        target.witness1.x = buffer[1];\n        target.witness1.y = buffer[2];\n        target.witness1.z = buffer[3];\n        target.witness2.x = buffer[4];\n        target.witness2.y = buffer[5];\n        target.witness2.z = buffer[6];\n        target.normal1.x = buffer[7];\n        target.normal1.y = buffer[8];\n        target.normal1.z = buffer[9];\n        target.normal2.x = buffer[10];\n        target.normal2.y = buffer[11];\n        target.normal2.z = buffer[12];\n        // #endif\n\n        return target;\n    }\n}\n\n/**\n * The result of a shape-cast that hit a collider.\n *\n * The frames of the witness points and normals depend on the query that returned it:\n * - `World.castShape` (and `BroadPhase.castShape`): `witness1` and `normal1` lie on the hit\n *   `collider` and are expressed in world-space; `witness2` and `normal2` lie on the cast\n *   shape and are expressed in its local-space (relative to its pose, so they do not depend\n *   on its translation along the cast).\n * - `Collider.castCollider`: `witness1` and `normal1` lie on the collider the cast is called\n *   on and are expressed in its local-space; `witness2` and `normal2` lie on the hit\n *   `collider` (the `collider2` argument) and are expressed in its local-space.\n */\nexport class ColliderShapeCastHit extends ShapeCastHit {\n    /**\n     * The collider hit by the shape-cast.\n     */\n    collider: Collider;\n\n    constructor(\n        collider: Collider,\n        time_of_impact: number,\n        witness1: Vector,\n        witness2: Vector,\n        normal1: Vector,\n        normal2: Vector,\n    ) {\n        super(time_of_impact, witness1, witness2, normal1, normal2);\n        this.collider = collider;\n    }\n\n    public static fromBuffer(\n        collider: Collider,\n        buffer: Float32Array,\n        target?: ColliderShapeCastHit,\n    ): ColliderShapeCastHit {\n        if (!buffer) return null;\n\n        target ??= new ColliderShapeCastHit(\n            null,\n            0,\n            VectorOps.zeros(),\n            VectorOps.zeros(),\n            VectorOps.zeros(),\n            VectorOps.zeros(),\n        );\n\n        target.collider = collider;\n\n        target.time_of_impact = buffer[0];\n\n\n        // #if DIM3\n        target.witness1.x = buffer[1];\n        target.witness1.y = buffer[2];\n        target.witness1.z = buffer[3];\n        target.witness2.x = buffer[4];\n        target.witness2.y = buffer[5];\n        target.witness2.z = buffer[6];\n        target.normal1.x = buffer[7];\n        target.normal1.y = buffer[8];\n        target.normal1.z = buffer[9];\n        target.normal2.x = buffer[10];\n        target.normal2.y = buffer[11];\n        target.normal2.z = buffer[12];\n        // #endif\n\n        return target;\n    }\n}\n","import {RawBroadPhase, RawRayColliderIntersection} from \"../raw\";\nimport {RigidBodyHandle, RigidBodySet} from \"../dynamics\";\nimport {ColliderSet} from \"./collider_set\";\nimport {Ray, RayColliderHit, RayColliderIntersection} from \"./ray\";\nimport {InteractionGroups} from \"./interaction_groups\";\nimport {ColliderHandle} from \"./collider\";\nimport {Rotation, RotationOps, Vector, VectorOps, scratchBuffer} from \"../math\";\nimport {Shape} from \"./shape\";\nimport {PointColliderProjection} from \"./point\";\nimport {ColliderShapeCastHit} from \"./toi\";\nimport {QueryFilterFlags} from \"../pipeline\";\nimport {NarrowPhase} from \"./narrow_phase\";\n\n/**\n * The broad-phase used for coarse collision-detection.\n *\n * To avoid leaking WASM resources, this MUST be freed manually with `broadPhase.free()`\n * once you are done using it.\n */\nexport class BroadPhase {\n    raw: RawBroadPhase;\n\n    /**\n     * Release the WASM memory occupied by this broad-phase.\n     */\n    public free() {\n        if (!!this.raw) {\n            this.raw.free();\n        }\n        this.raw = undefined;\n    }\n\n    constructor(raw?: RawBroadPhase) {\n        this.raw = raw || new RawBroadPhase();\n    }\n\n    /**\n     * Find the closest intersection between a ray and a set of collider.\n     *\n     * @param colliders - The set of colliders taking part in this pipeline.\n     * @param ray - The ray to cast.\n     * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively\n     *   limits the length of the ray to `ray.dir.norm() * maxToi`.\n     * @param solid - If `false` then the ray will attempt to hit the boundary of a shape, even if its\n     *   origin already lies inside of a shape. In other terms, `true` implies that all shapes are plain,\n     *   whereas `false` implies that all shapes are hollow for this ray-cast.\n     * @param groups - Used to filter the colliders that can or cannot be hit by the ray.\n     * @param filter - The callback to filter out which collider will be hit.\n     */\n    public castRay(\n        narrowPhase: NarrowPhase,\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n        ray: Ray,\n        maxToi: number,\n        solid: boolean,\n        filterFlags?: QueryFilterFlags,\n        filterGroups?: InteractionGroups,\n        filterExcludeCollider?: ColliderHandle,\n        filterExcludeRigidBody?: RigidBodyHandle,\n        filterPredicate?: (collider: ColliderHandle) => boolean,\n    ): RayColliderHit | null {\n        let rawOrig = VectorOps.intoRaw(ray.origin);\n        let rawDir = VectorOps.intoRaw(ray.dir);\n        let result = RayColliderHit.fromRaw(\n            colliders,\n            this.raw.castRay(\n                narrowPhase.raw,\n                bodies.raw,\n                colliders.raw,\n                rawOrig,\n                rawDir,\n                maxToi,\n                solid,\n                filterFlags,\n                filterGroups,\n                filterExcludeCollider,\n                filterExcludeRigidBody,\n                filterPredicate,\n            ),\n        );\n\n        rawOrig.free();\n        rawDir.free();\n\n        return result;\n    }\n\n    /**\n     * Find the closest intersection between a ray and a set of collider.\n     *\n     * This also computes the normal at the hit point.\n     * @param colliders - The set of colliders taking part in this pipeline.\n     * @param ray - The ray to cast.\n     * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively\n     *   limits the length of the ray to `ray.dir.norm() * maxToi`.\n     * @param solid - If `false` then the ray will attempt to hit the boundary of a shape, even if its\n     *   origin already lies inside of a shape. In other terms, `true` implies that all shapes are plain,\n     *   whereas `false` implies that all shapes are hollow for this ray-cast.\n     * @param groups - Used to filter the colliders that can or cannot be hit by the ray.\n     */\n    public castRayAndGetNormal(\n        narrowPhase: NarrowPhase,\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n        ray: Ray,\n        maxToi: number,\n        solid: boolean,\n        filterFlags?: QueryFilterFlags,\n        filterGroups?: InteractionGroups,\n        filterExcludeCollider?: ColliderHandle,\n        filterExcludeRigidBody?: RigidBodyHandle,\n        filterPredicate?: (collider: ColliderHandle) => boolean,\n        target?: RayColliderIntersection,\n    ): RayColliderIntersection | null {\n        let rawOrig = VectorOps.intoRaw(ray.origin);\n        let rawDir = VectorOps.intoRaw(ray.dir);\n        let result = RayColliderIntersection.fromBuffer(\n            colliders,\n            this.raw.castRayAndGetNormal(\n                narrowPhase.raw,\n                bodies.raw,\n                colliders.raw,\n                rawOrig,\n                rawDir,\n                maxToi,\n                solid,\n                filterFlags,\n                filterGroups,\n                filterExcludeCollider,\n                filterExcludeRigidBody,\n                filterPredicate,\n            ),\n            target,\n        );\n\n        rawOrig.free();\n        rawDir.free();\n\n        return result;\n    }\n\n    /**\n     * Cast a ray and collects all the intersections between a ray and the scene.\n     *\n     * @param colliders - The set of colliders taking part in this pipeline.\n     * @param ray - The ray to cast.\n     * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively\n     *   limits the length of the ray to `ray.dir.norm() * maxToi`.\n     * @param solid - If `false` then the ray will attempt to hit the boundary of a shape, even if its\n     *   origin already lies inside of a shape. In other terms, `true` implies that all shapes are plain,\n     *   whereas `false` implies that all shapes are hollow for this ray-cast.\n     * @param groups - Used to filter the colliders that can or cannot be hit by the ray.\n     * @param callback - The callback called once per hit (in no particular order) between a ray and a collider.\n     *   If this callback returns `false`, then the cast will stop and no further hits will be detected/reported.\n     */\n    public intersectionsWithRay(\n        narrowPhase: NarrowPhase,\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n        ray: Ray,\n        maxToi: number,\n        solid: boolean,\n        callback: (intersect: RayColliderIntersection) => boolean,\n        filterFlags?: QueryFilterFlags,\n        filterGroups?: InteractionGroups,\n        filterExcludeCollider?: ColliderHandle,\n        filterExcludeRigidBody?: RigidBodyHandle,\n        filterPredicate?: (collider: ColliderHandle) => boolean,\n    ) {\n        let rawOrig = VectorOps.intoRaw(ray.origin);\n        let rawDir = VectorOps.intoRaw(ray.dir);\n        let rawCallback = (rawInter: RawRayColliderIntersection) => {\n            return callback(\n                RayColliderIntersection.fromBuffer(colliders, rawInter),\n            );\n        };\n\n        this.raw.intersectionsWithRay(\n            narrowPhase.raw,\n            bodies.raw,\n            colliders.raw,\n            rawOrig,\n            rawDir,\n            maxToi,\n            solid,\n            rawCallback,\n            filterFlags,\n            filterGroups,\n            filterExcludeCollider,\n            filterExcludeRigidBody,\n            filterPredicate,\n        );\n\n        rawOrig.free();\n        rawDir.free();\n    }\n\n    /**\n     * Gets the handle of up to one collider intersecting the given shape.\n     *\n     * @param colliders - The set of colliders taking part in this pipeline.\n     * @param shapePos - The position of the shape used for the intersection test.\n     * @param shapeRot - The orientation of the shape used for the intersection test.\n     * @param shape - The shape used for the intersection test.\n     * @param groups - The bit groups and filter associated to the ray, in order to only\n     *   hit the colliders with collision groups compatible with the ray's group.\n     */\n    public intersectionWithShape(\n        narrowPhase: NarrowPhase,\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n        shapePos: Vector,\n        shapeRot: Rotation,\n        shape: Shape,\n        filterFlags?: QueryFilterFlags,\n        filterGroups?: InteractionGroups,\n        filterExcludeCollider?: ColliderHandle,\n        filterExcludeRigidBody?: RigidBodyHandle,\n        filterPredicate?: (collider: ColliderHandle) => boolean,\n    ): ColliderHandle | null {\n        let rawPos = VectorOps.intoRaw(shapePos);\n        let rawRot = RotationOps.intoRaw(shapeRot);\n        let rawShape = shape.intoRaw();\n        let result = this.raw.intersectionWithShape(\n            narrowPhase.raw,\n            bodies.raw,\n            colliders.raw,\n            rawPos,\n            rawRot,\n            rawShape,\n            filterFlags,\n            filterGroups,\n            filterExcludeCollider,\n            filterExcludeRigidBody,\n            filterPredicate,\n        );\n\n        rawPos.free();\n        rawRot.free();\n        rawShape.free();\n\n        return result;\n    }\n\n    /**\n     * Find the projection of a point on the closest collider.\n     *\n     * @param colliders - The set of colliders taking part in this pipeline.\n     * @param point - The point to project.\n     * @param solid - If this is set to `true` then the collider shapes are considered to\n     *   be plain (if the point is located inside of a plain shape, its projection is the point\n     *   itself). If it is set to `false` the collider shapes are considered to be hollow\n     *   (if the point is located inside of an hollow shape, it is projected on the shape's\n     *   boundary).\n     * @param groups - The bit groups and filter associated to the point to project, in order to only\n     *   project on colliders with collision groups compatible with the ray's group.\n     */\n    public projectPoint(\n        narrowPhase: NarrowPhase,\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n        point: Vector,\n        solid: boolean,\n        filterFlags?: QueryFilterFlags,\n        filterGroups?: InteractionGroups,\n        filterExcludeCollider?: ColliderHandle,\n        filterExcludeRigidBody?: RigidBodyHandle,\n        filterPredicate?: (collider: ColliderHandle) => boolean,\n        target?: PointColliderProjection,\n    ): PointColliderProjection | null {\n        let rawPoint = VectorOps.intoRaw(point);\n        let result = PointColliderProjection.fromBuffer(\n            colliders,\n            this.raw.projectPoint(\n                narrowPhase.raw,\n                bodies.raw,\n                colliders.raw,\n                rawPoint,\n                solid,\n                filterFlags,\n                filterGroups,\n                filterExcludeCollider,\n                filterExcludeRigidBody,\n                filterPredicate,\n            ),\n            target,\n        );\n\n        rawPoint.free();\n\n        return result;\n    }\n\n    /**\n     * Find the projection of a point on the closest collider.\n     *\n     * @param colliders - The set of colliders taking part in this pipeline.\n     * @param point - The point to project.\n     * @param groups - The bit groups and filter associated to the point to project, in order to only\n     *   project on colliders with collision groups compatible with the ray's group.\n     */\n    public projectPointAndGetFeature(\n        narrowPhase: NarrowPhase,\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n        point: Vector,\n        filterFlags?: QueryFilterFlags,\n        filterGroups?: InteractionGroups,\n        filterExcludeCollider?: ColliderHandle,\n        filterExcludeRigidBody?: RigidBodyHandle,\n        filterPredicate?: (collider: ColliderHandle) => boolean,\n        target?: PointColliderProjection,\n    ): PointColliderProjection | null {\n        let rawPoint = VectorOps.intoRaw(point);\n        let result = PointColliderProjection.fromBuffer(\n            colliders,\n            this.raw.projectPointAndGetFeature(\n                narrowPhase.raw,\n                bodies.raw,\n                colliders.raw,\n                rawPoint,\n                filterFlags,\n                filterGroups,\n                filterExcludeCollider,\n                filterExcludeRigidBody,\n                filterPredicate,\n            ),\n            target,\n        );\n\n        rawPoint.free();\n\n        return result;\n    }\n\n    /**\n     * Find all the colliders containing the given point.\n     *\n     * @param colliders - The set of colliders taking part in this pipeline.\n     * @param point - The point used for the containment test.\n     * @param groups - The bit groups and filter associated to the point to test, in order to only\n     *   test on colliders with collision groups compatible with the ray's group.\n     * @param callback - A function called with the handles of each collider with a shape\n     *   containing the `point`.\n     */\n    public intersectionsWithPoint(\n        narrowPhase: NarrowPhase,\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n        point: Vector,\n        callback: (handle: ColliderHandle) => boolean,\n        filterFlags?: QueryFilterFlags,\n        filterGroups?: InteractionGroups,\n        filterExcludeCollider?: ColliderHandle,\n        filterExcludeRigidBody?: RigidBodyHandle,\n        filterPredicate?: (collider: ColliderHandle) => boolean,\n    ) {\n        let rawPoint = VectorOps.intoRaw(point);\n\n        this.raw.intersectionsWithPoint(\n            narrowPhase.raw,\n            bodies.raw,\n            colliders.raw,\n            rawPoint,\n            callback,\n            filterFlags,\n            filterGroups,\n            filterExcludeCollider,\n            filterExcludeRigidBody,\n            filterPredicate,\n        );\n\n        rawPoint.free();\n    }\n\n    /**\n     * Casts a shape at a constant linear velocity and retrieve the first collider it hits.\n     * This is similar to ray-casting except that we are casting a whole shape instead of\n     * just a point (the ray origin).\n     *\n     * In the returned hit, `witness1` and `normal1` lie on the hit collider and are expressed in\n     * world-space, while `witness2` and `normal2` lie on the cast shape and are expressed in its\n     * local-space (relative to `shapePos` and `shapeRot`).\n     *\n     * @param colliders - The set of colliders taking part in this pipeline.\n     * @param shapePos - The initial position of the shape to cast.\n     * @param shapeRot - The initial rotation of the shape to cast.\n     * @param shapeVel - The constant velocity of the shape to cast (i.e. the cast direction).\n     * @param shape - The shape to cast.\n     * @param targetDistance − If the shape moves closer to this distance from a collider, a hit\n     *                       will be returned.\n     * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively\n     *   limits the distance traveled by the shape to `shapeVel.norm() * maxToi`.\n     * @param stopAtPenetration - If set to `false`, the linear shape-cast won’t immediately stop if\n     *   the shape is penetrating another shape at its starting point **and** its trajectory is such\n     *   that it’s on a path to exit that penetration state.\n     * @param groups - The bit groups and filter associated to the shape to cast, in order to only\n     *   test on colliders with collision groups compatible with this group.\n     * @param {ColliderShapeCastHit?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public castShape(\n        narrowPhase: NarrowPhase,\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n        shapePos: Vector,\n        shapeRot: Rotation,\n        shapeVel: Vector,\n        shape: Shape,\n        targetDistance: number,\n        maxToi: number,\n        stopAtPenetration: boolean,\n        filterFlags?: QueryFilterFlags,\n        filterGroups?: InteractionGroups,\n        filterExcludeCollider?: ColliderHandle,\n        filterExcludeRigidBody?: RigidBodyHandle,\n        filterPredicate?: (collider: ColliderHandle) => boolean,\n        target?: ColliderShapeCastHit,\n    ): ColliderShapeCastHit | null {\n        let rawPos = VectorOps.intoRaw(shapePos);\n        let rawRot = RotationOps.intoRaw(shapeRot);\n        let rawVel = VectorOps.intoRaw(shapeVel);\n        let rawShape = shape.intoRaw();\n\n        const rawColliderShapeCastHit = this.raw.castShape(\n            narrowPhase.raw,\n            bodies.raw,\n            colliders.raw,\n            rawPos,\n            rawRot,\n            rawVel,\n            rawShape,\n            targetDistance,\n            maxToi,\n            stopAtPenetration,\n            filterFlags,\n            filterGroups,\n            filterExcludeCollider,\n            filterExcludeRigidBody,\n            filterPredicate,\n        );\n\n        let result = null;\n        if (rawColliderShapeCastHit) {\n            const colliderHandle: number =\n                rawColliderShapeCastHit.colliderHandle();\n            rawColliderShapeCastHit.getComponents(scratchBuffer);\n            result = ColliderShapeCastHit.fromBuffer(\n                colliders.get(colliderHandle),\n                scratchBuffer,\n                target,\n            );\n            rawColliderShapeCastHit.free();\n        }\n\n        rawPos.free();\n        rawRot.free();\n        rawVel.free();\n        rawShape.free();\n\n        return result;\n    }\n\n    /**\n     * Retrieve all the colliders intersecting the given shape.\n     *\n     * @param colliders - The set of colliders taking part in this pipeline.\n     * @param shapePos - The position of the shape to test.\n     * @param shapeRot - The orientation of the shape to test.\n     * @param shape - The shape to test.\n     * @param groups - The bit groups and filter associated to the shape to test, in order to only\n     *   test on colliders with collision groups compatible with this group.\n     * @param callback - A function called with the handles of each collider intersecting the `shape`.\n     */\n    public intersectionsWithShape(\n        narrowPhase: NarrowPhase,\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n        shapePos: Vector,\n        shapeRot: Rotation,\n        shape: Shape,\n        callback: (handle: ColliderHandle) => boolean,\n        filterFlags?: QueryFilterFlags,\n        filterGroups?: InteractionGroups,\n        filterExcludeCollider?: ColliderHandle,\n        filterExcludeRigidBody?: RigidBodyHandle,\n        filterPredicate?: (collider: ColliderHandle) => boolean,\n    ) {\n        let rawPos = VectorOps.intoRaw(shapePos);\n        let rawRot = RotationOps.intoRaw(shapeRot);\n        let rawShape = shape.intoRaw();\n\n        this.raw.intersectionsWithShape(\n            narrowPhase.raw,\n            bodies.raw,\n            colliders.raw,\n            rawPos,\n            rawRot,\n            rawShape,\n            callback,\n            filterFlags,\n            filterGroups,\n            filterExcludeCollider,\n            filterExcludeRigidBody,\n            filterPredicate,\n        );\n\n        rawPos.free();\n        rawRot.free();\n        rawShape.free();\n    }\n\n    /**\n     * Finds the handles of all the colliders with an AABB intersecting the given AABB.\n     *\n     * @param aabbCenter - The center of the AABB to test.\n     * @param aabbHalfExtents - The half-extents of the AABB to test.\n     * @param callback - The callback that will be called with the handles of all the colliders\n     *                   currently intersecting the given AABB.\n     */\n    public collidersWithAabbIntersectingAabb(\n        narrowPhase: NarrowPhase,\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n        aabbCenter: Vector,\n        aabbHalfExtents: Vector,\n        callback: (handle: ColliderHandle) => boolean,\n    ) {\n        let rawCenter = VectorOps.intoRaw(aabbCenter);\n        let rawHalfExtents = VectorOps.intoRaw(aabbHalfExtents);\n        this.raw.collidersWithAabbIntersectingAabb(\n            narrowPhase.raw,\n            bodies.raw,\n            colliders.raw,\n            rawCenter,\n            rawHalfExtents,\n            callback,\n        );\n        rawCenter.free();\n        rawHalfExtents.free();\n    }\n}\n","import {RawNarrowPhase, RawContactManifold} from \"../raw\";\nimport {ColliderHandle} from \"./collider\";\nimport {RigidBodySet} from \"../dynamics\";\nimport {Vector, VectorOps, scratchBuffer} from \"../math\";\n\n/**\n * The narrow-phase used for precise collision-detection.\n *\n * To avoid leaking WASM resources, this MUST be freed manually with `narrowPhase.free()`\n * once you are done using it.\n */\nexport class NarrowPhase {\n    raw: RawNarrowPhase;\n    tempManifold: TempContactManifold;\n\n    /**\n     * Release the WASM memory occupied by this narrow-phase.\n     */\n    public free() {\n        if (!!this.raw) {\n            this.raw.free();\n        }\n        this.raw = undefined;\n    }\n\n    constructor(raw?: RawNarrowPhase) {\n        this.raw = raw || new RawNarrowPhase();\n        this.tempManifold = new TempContactManifold(null);\n    }\n\n    /**\n     * Enumerates all the colliders potentially in contact with the given collider.\n     *\n     * @param collider1 - The second collider involved in the contact.\n     * @param f - Closure that will be called on each collider that is in contact with `collider1`.\n     */\n    public contactPairsWith(\n        collider1: ColliderHandle,\n        f: (collider2: ColliderHandle) => void,\n    ) {\n        this.raw.contact_pairs_with(collider1, f);\n    }\n\n    /**\n     * Enumerates all the colliders intersecting the given colliders, assuming one of them\n     * is a sensor.\n     */\n    public intersectionPairsWith(\n        collider1: ColliderHandle,\n        f: (collider2: ColliderHandle) => void,\n    ) {\n        this.raw.intersection_pairs_with(collider1, f);\n    }\n\n    /**\n     * Iterates through all the contact manifolds between the given pair of colliders.\n     *\n     * @param collider1 - The first collider involved in the contact.\n     * @param collider2 - The second collider involved in the contact.\n     * @param bodies - The set of rigid-bodies the colliders are attached to. Solver contacts are\n     *                 anchored in body-local space, so this is needed to read them back in world-space.\n     * @param f - Closure that will be called on each contact manifold between the two colliders. If the second argument\n     *            passed to this closure is `true`, then the contact manifold data is flipped, i.e., methods like `localNormal1`\n     *            actually apply to the `collider2` and fields like `localNormal2` apply to the `collider1`.\n     */\n    public contactPair(\n        collider1: ColliderHandle,\n        collider2: ColliderHandle,\n        bodies: RigidBodySet,\n        f: (manifold: TempContactManifold, flipped: boolean) => void,\n    ) {\n        const rawPair = this.raw.contact_pair(collider1, collider2);\n\n        if (!!rawPair) {\n            const flipped = rawPair.collider1() != collider1;\n\n            let i;\n            for (i = 0; i < rawPair.numContactManifolds(); ++i) {\n                this.tempManifold.bodies = bodies;\n                this.tempManifold.raw = rawPair.contactManifold(i);\n                if (!!this.tempManifold.raw) {\n                    f(this.tempManifold, flipped);\n                }\n\n                // SAFETY: The RawContactManifold stores a raw pointer that will be invalidated\n                //         at the next timestep. So we must be sure to free the pair here\n                //         to avoid unsoundness in the Rust code.\n                this.tempManifold.free();\n            }\n            rawPair.free();\n        }\n    }\n\n    /**\n     * Returns `true` if `collider1` and `collider2` intersect and at least one of them is a sensor.\n     * @param collider1 − The first collider involved in the intersection.\n     * @param collider2 − The second collider involved in the intersection.\n     */\n    public intersectionPair(\n        collider1: ColliderHandle,\n        collider2: ColliderHandle,\n    ): boolean {\n        return this.raw.intersection_pair(collider1, collider2);\n    }\n}\n\nexport class TempContactManifold {\n    raw: RawContactManifold;\n    /** The bodies the manifold's solver contacts are anchored to. */\n    bodies: RigidBodySet;\n\n    public free() {\n        if (!!this.raw) {\n            this.raw.free();\n        }\n        this.raw = undefined;\n    }\n\n    constructor(raw: RawContactManifold, bodies?: RigidBodySet) {\n        this.raw = raw;\n        this.bodies = bodies;\n    }\n\n    /**\n     * The contact normal of the manifold, expressed in world-space.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public normal(target?: Vector): Vector {\n        this.raw.normal(scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n    /**\n     * The contact normal of the manifold, expressed in the local-space of the first shape.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public localNormal1(target?: Vector): Vector {\n        this.raw.local_n1(scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n    /**\n     * The contact normal of the manifold, expressed in the local-space of the second shape.\n     *\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public localNormal2(target?: Vector): Vector {\n        this.raw.local_n2(scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n    public subshape1(): number {\n        return this.raw.subshape1();\n    }\n\n    public subshape2(): number {\n        return this.raw.subshape2();\n    }\n\n    public numContacts(): number {\n        return this.raw.num_contacts();\n    }\n\n    /**\n     * The local-space contact point on the first shape, for the `i`-th contact.\n     *\n     * @param {number} i - The index of the contact to read.\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public localContactPoint1(i: number, target?: Vector): Vector | null {\n        const exists = this.raw.contact_local_p1(i, scratchBuffer);\n        return exists ? VectorOps.fromBuffer(scratchBuffer, target) : null;\n    }\n\n    /**\n     * The local-space contact point on the second shape, for the `i`-th contact.\n     *\n     * @param {number} i - The index of the contact to read.\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public localContactPoint2(i: number, target?: Vector): Vector | null {\n        const exists = this.raw.contact_local_p2(i, scratchBuffer);\n        return exists ? VectorOps.fromBuffer(scratchBuffer, target) : null;\n    }\n\n    public contactDist(i: number): number {\n        return this.raw.contact_dist(i);\n    }\n\n    public contactFid1(i: number): number {\n        return this.raw.contact_fid1(i);\n    }\n\n    public contactFid2(i: number): number {\n        return this.raw.contact_fid2(i);\n    }\n\n    public contactImpulse(i: number): number {\n        return this.raw.contact_impulse(i);\n    }\n\n\n    // #if DIM3\n    public contactTangentImpulseX(i: number): number {\n        return this.raw.contact_tangent_impulse_x(i);\n    }\n\n    public contactTangentImpulseY(i: number): number {\n        return this.raw.contact_tangent_impulse_y(i);\n    }\n    // #endif\n\n    public numSolverContacts(): number {\n        return this.raw.num_solver_contacts();\n    }\n\n    /**\n     * The world-space position of the `i`-th solver contact point.\n     *\n     * @param {number} i - The index of the solver contact to read.\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public solverContactPoint(i: number, target?: Vector): Vector | null {\n        const exists = this.raw.solver_contact_point(\n            this.bodies.raw,\n            i,\n            scratchBuffer,\n        );\n        return exists ? VectorOps.fromBuffer(scratchBuffer, target) : null;\n    }\n\n    public solverContactDist(i: number): number {\n        return this.raw.solver_contact_dist(i);\n    }\n\n    /**\n     * The friction coefficient applied to this manifold's solver contacts. It is combined\n     * once per manifold, so every solver contact of this manifold shares it.\n     */\n    public friction(): number {\n        return this.raw.friction();\n    }\n\n    /**\n     * The restitution coefficient applied to this manifold's solver contacts. It is\n     * combined once per manifold, so every solver contact of this manifold shares it.\n     */\n    public restitution(): number {\n        return this.raw.restitution();\n    }\n\n    /**\n     * The tangent (surface) velocity of the `i`-th solver contact point.\n     *\n     * @param {number} i - The index of the solver contact to read.\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public solverContactTangentVelocity(i: number, target?: Vector): Vector {\n        this.raw.solver_contact_tangent_velocity(i, scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n}\n","import {Vector, VectorOps, scratchBuffer} from \"../math\";\nimport {RawShapeContact} from \"../raw\";\n\n/**\n * The contact info between two shapes.\n */\nexport class ShapeContact {\n    /**\n     * Distance between the two contact points.\n     * If this is negative, this contact represents a penetration.\n     */\n    distance: number;\n\n    /**\n     * Position of the contact on the first shape.\n     */\n    point1: Vector;\n\n    /**\n     * Position of the contact on the second shape.\n     */\n    point2: Vector;\n\n    /**\n     * Contact normal, pointing towards the exterior of the first shape.\n     */\n    normal1: Vector;\n\n    /**\n     * Contact normal, pointing towards the exterior of the second shape.\n     * If these contact data are expressed in world-space, this normal is equal to -normal1.\n     */\n    normal2: Vector;\n\n    constructor(\n        dist: number,\n        point1: Vector,\n        point2: Vector,\n        normal1: Vector,\n        normal2: Vector,\n    ) {\n        this.distance = dist;\n        this.point1 = point1;\n        this.point2 = point2;\n        this.normal1 = normal1;\n        this.normal2 = normal2;\n    }\n\n    /**\n     * @param raw - The raw contact returned by the WASM query. It is freed by this method.\n     * @param target - If provided, this object is populated and returned instead of\n     * allocating a new one.\n     */\n    public static fromBuffer(\n        raw: RawShapeContact,\n        target?: ShapeContact,\n    ): ShapeContact {\n        if (!raw) return null;\n\n        raw.getComponents(scratchBuffer);\n        raw.free();\n\n        target ??= new ShapeContact(\n            0,\n            VectorOps.zeros(),\n            VectorOps.zeros(),\n            VectorOps.zeros(),\n            VectorOps.zeros(),\n        );\n\n        target.distance = scratchBuffer[0];\n\n\n        // #if DIM3\n        target.point1.x = scratchBuffer[1];\n        target.point1.y = scratchBuffer[2];\n        target.point1.z = scratchBuffer[3];\n        target.point2.x = scratchBuffer[4];\n        target.point2.y = scratchBuffer[5];\n        target.point2.z = scratchBuffer[6];\n        target.normal1.x = scratchBuffer[7];\n        target.normal1.y = scratchBuffer[8];\n        target.normal1.z = scratchBuffer[9];\n        target.normal2.x = scratchBuffer[10];\n        target.normal2.y = scratchBuffer[11];\n        target.normal2.z = scratchBuffer[12];\n        // #endif\n\n        return target;\n    }\n}\n","import {RawPhysicsPipeline} from \"../raw\";\nimport {Vector, VectorOps} from \"../math\";\nimport {\n    IntegrationParameters,\n    ImpulseJointSet,\n    MultibodyJointSet,\n    RigidBodyHandle,\n    RigidBodySet,\n    CCDSolver,\n    IslandManager,\n    SoftBodySet,\n} from \"../dynamics\";\nimport {\n    BroadPhase,\n    ColliderHandle,\n    ColliderSet,\n    NarrowPhase,\n} from \"../geometry\";\nimport {EventQueue} from \"./event_queue\";\nimport {PhysicsHooks} from \"./physics_hooks\";\n\nexport class PhysicsPipeline {\n    raw: RawPhysicsPipeline;\n\n    public free() {\n        if (!!this.raw) {\n            this.raw.free();\n        }\n        this.raw = undefined;\n    }\n\n    constructor(raw?: RawPhysicsPipeline) {\n        this.raw = raw || new RawPhysicsPipeline();\n    }\n\n    public step(\n        gravity: Vector,\n        integrationParameters: IntegrationParameters,\n        islands: IslandManager,\n        broadPhase: BroadPhase,\n        narrowPhase: NarrowPhase,\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n        softBodies: SoftBodySet,\n        impulseJoints: ImpulseJointSet,\n        multibodyJoints: MultibodyJointSet,\n        ccdSolver: CCDSolver,\n        eventQueue?: EventQueue,\n        hooks?: PhysicsHooks,\n    ) {\n        let rawG = VectorOps.intoRaw(gravity);\n\n        if (!!eventQueue) {\n            this.raw.stepWithEvents(\n                rawG,\n                integrationParameters.raw,\n                islands.raw,\n                broadPhase.raw,\n                narrowPhase.raw,\n                bodies.raw,\n                colliders.raw,\n                softBodies.raw,\n                impulseJoints.raw,\n                multibodyJoints.raw,\n                ccdSolver.raw,\n                eventQueue.raw,\n                hooks,\n                !!hooks ? hooks.filterContactPair : null,\n                !!hooks ? hooks.filterIntersectionPair : null,\n            );\n        } else {\n            this.raw.step(\n                rawG,\n                integrationParameters.raw,\n                islands.raw,\n                broadPhase.raw,\n                narrowPhase.raw,\n                bodies.raw,\n                colliders.raw,\n                softBodies.raw,\n                impulseJoints.raw,\n                multibodyJoints.raw,\n                ccdSolver.raw,\n            );\n        }\n\n        rawG.free();\n    }\n}\n","import {RawSerializationPipeline} from \"../raw\";\nimport {Vector, VectorOps} from \"../math\";\nimport {\n    IntegrationParameters,\n    IslandManager,\n    ImpulseJointSet,\n    MultibodyJointSet,\n    RigidBodySet,\n    SoftBodySet,\n} from \"../dynamics\";\nimport {BroadPhase, ColliderSet, NarrowPhase} from \"../geometry\";\nimport {World} from \"./world\";\n\n/**\n * A pipeline for serializing the physics scene.\n *\n * To avoid leaking WASM resources, this MUST be freed manually with `serializationPipeline.free()`\n * once you are done using it (and all the rigid-bodies it created).\n */\nexport class SerializationPipeline {\n    raw: RawSerializationPipeline;\n\n    /**\n     * Release the WASM memory occupied by this serialization pipeline.\n     */\n    free() {\n        if (!!this.raw) {\n            this.raw.free();\n        }\n        this.raw = undefined;\n    }\n\n    constructor(raw?: RawSerializationPipeline) {\n        this.raw = raw || new RawSerializationPipeline();\n    }\n\n    /**\n     * Serialize a complete physics state into a single byte array.\n     * @param gravity - The current gravity affecting the simulation.\n     * @param integrationParameters - The integration parameters of the simulation.\n     * @param broadPhase - The broad-phase of the simulation.\n     * @param narrowPhase - The narrow-phase of the simulation.\n     * @param bodies - The rigid-bodies taking part into the simulation.\n     * @param colliders - The colliders taking part into the simulation.\n     * @param impulseJoints - The impulse joints taking part into the simulation.\n     * @param multibodyJoints - The multibody joints taking part into the simulation.\n     */\n    public serializeAll(\n        gravity: Vector,\n        integrationParameters: IntegrationParameters,\n        islands: IslandManager,\n        broadPhase: BroadPhase,\n        narrowPhase: NarrowPhase,\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n        softBodies: SoftBodySet,\n        impulseJoints: ImpulseJointSet,\n        multibodyJoints: MultibodyJointSet,\n    ): Uint8Array {\n        let rawGra = VectorOps.intoRaw(gravity);\n\n        const res = this.raw.serializeAll(\n            rawGra,\n            integrationParameters.raw,\n            islands.raw,\n            broadPhase.raw,\n            narrowPhase.raw,\n            bodies.raw,\n            colliders.raw,\n            softBodies.raw,\n            impulseJoints.raw,\n            multibodyJoints.raw,\n        );\n        rawGra.free();\n\n        return res;\n    }\n\n    /**\n     * Deserialize the complete physics state from a single byte array.\n     *\n     * @param data - The byte array to deserialize.\n     */\n    public deserializeAll(data: Uint8Array): World {\n        return World.fromRaw(this.raw.deserializeAll(data));\n    }\n}\n","import {RawDebugRenderPipeline} from \"../raw\";\nimport {Vector, VectorOps} from \"../math\";\nimport {\n    IntegrationParameters,\n    IslandManager,\n    ImpulseJointSet,\n    MultibodyJointSet,\n    RigidBodySet,\n    SoftBodySet,\n} from \"../dynamics\";\nimport {BroadPhase, Collider, ColliderSet, NarrowPhase} from \"../geometry\";\nimport {QueryFilterFlags} from \"./query_pipeline\";\n\n/**\n * The vertex and color buffers for debug-rendering the physics scene.\n */\nexport class DebugRenderBuffers {\n    /**\n     * The lines to render. This is a flat array containing all the lines\n     * to render. Each line is described as two consecutive point. Each\n     * point is described as two (in 2D) or three (in 3D) consecutive\n     * floats. For example, in 2D, the array: `[1, 2, 3, 4, 5, 6, 7, 8]`\n     * describes the two segments `[[1, 2], [3, 4]]` and `[[5, 6], [7, 8]]`.\n     */\n    public vertices: Float32Array;\n    /**\n     * The color buffer. There is one color per vertex, and each color\n     * has four consecutive components (in RGBA format).\n     */\n    public colors: Float32Array;\n\n    constructor(vertices: Float32Array, colors: Float32Array) {\n        this.vertices = vertices;\n        this.colors = colors;\n    }\n}\n\n/**\n * A pipeline for rendering the physics scene.\n *\n * To avoid leaking WASM resources, this MUST be freed manually with `debugRenderPipeline.free()`\n * once you are done using it (and all the rigid-bodies it created).\n */\nexport class DebugRenderPipeline {\n    raw: RawDebugRenderPipeline;\n    public vertices: Float32Array;\n    public colors: Float32Array;\n\n    /**\n     * Release the WASM memory occupied by this serialization pipeline.\n     */\n    free() {\n        if (!!this.raw) {\n            this.raw.free();\n        }\n        this.raw = undefined;\n        this.vertices = undefined;\n        this.colors = undefined;\n    }\n\n    constructor(raw?: RawDebugRenderPipeline) {\n        this.raw = raw || new RawDebugRenderPipeline();\n    }\n\n    public render(\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n        soft_bodies: SoftBodySet,\n        impulse_joints: ImpulseJointSet,\n        multibody_joints: MultibodyJointSet,\n        narrow_phase: NarrowPhase,\n        filterFlags?: QueryFilterFlags,\n        filterPredicate?: (collider: Collider) => boolean,\n    ) {\n        this.raw.render(\n            bodies.raw,\n            colliders.raw,\n            soft_bodies.raw,\n            impulse_joints.raw,\n            multibody_joints.raw,\n            narrow_phase.raw,\n            filterFlags,\n            colliders.castClosure(filterPredicate),\n        );\n        this.vertices = this.raw.vertices();\n        this.colors = this.raw.colors();\n    }\n}\n","import {RawKinematicCharacterController, RawCharacterCollision} from \"../raw\";\nimport {Rotation, Vector, VectorOps, scratchBuffer} from \"../math\";\nimport {\n    BroadPhase,\n    Collider,\n    ColliderSet,\n    InteractionGroups,\n    NarrowPhase,\n    Shape,\n} from \"../geometry\";\nimport {QueryFilterFlags, World} from \"../pipeline\";\nimport {IntegrationParameters, RigidBody, RigidBodySet} from \"../dynamics\";\n\n/**\n * A collision between the character and an obstacle hit on its path.\n */\nexport class CharacterCollision {\n    /** The collider involved in the collision. Null if the collider no longer exists in the physics world. */\n    public collider: Collider | null;\n    /** The translation delta applied to the character before this collision took place. */\n    public translationDeltaApplied: Vector;\n    /** The translation delta the character would move after this collision if there is no other obstacles. */\n    public translationDeltaRemaining: Vector;\n    /** The time-of-impact between the character and the obstacles. */\n    public toi: number;\n    /** The world-space contact point on the collider when the collision happens. */\n    public witness1: Vector;\n    /** The world-space contact point on the character when the collision happens. */\n    public witness2: Vector;\n    /** The world-space outward contact normal on the collider when the collision happens. */\n    public normal1: Vector;\n    /** The world-space outward contact normal on the character when the collision happens. */\n    public normal2: Vector;\n}\n\n/**\n * A character controller for controlling kinematic bodies and parentless colliders by hitting\n * and sliding against obstacles.\n */\nexport class KinematicCharacterController {\n    private raw: RawKinematicCharacterController;\n    private rawCharacterCollision: RawCharacterCollision;\n\n    private params: IntegrationParameters;\n    private broadPhase: BroadPhase;\n    private narrowPhase: NarrowPhase;\n    private bodies: RigidBodySet;\n    private colliders: ColliderSet;\n    private _applyImpulsesToDynamicBodies: boolean;\n    private _characterMass: number | null;\n\n    constructor(\n        offset: number,\n        params: IntegrationParameters,\n        broadPhase: BroadPhase,\n        narrowPhase: NarrowPhase,\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n    ) {\n        this.params = params;\n        this.bodies = bodies;\n        this.colliders = colliders;\n        this.broadPhase = broadPhase;\n        this.narrowPhase = narrowPhase;\n        this.raw = new RawKinematicCharacterController(offset);\n        this.rawCharacterCollision = new RawCharacterCollision();\n        this._applyImpulsesToDynamicBodies = false;\n        this._characterMass = null;\n    }\n\n    /** @internal */\n    public free() {\n        if (!!this.raw) {\n            this.raw.free();\n            this.rawCharacterCollision.free();\n        }\n\n        this.raw = undefined;\n        this.rawCharacterCollision = undefined;\n    }\n\n    /**\n     * The direction that goes \"up\". Used to determine where the floor is, and the floor’s angle.\n     */\n    public up(): Vector {\n        return this.raw.up();\n    }\n\n    /**\n     * Sets the direction that goes \"up\". Used to determine where the floor is, and the floor’s angle.\n     */\n    public setUp(vector: Vector) {\n        let rawVect = VectorOps.intoRaw(vector);\n        return this.raw.setUp(rawVect);\n        rawVect.free();\n    }\n\n    public applyImpulsesToDynamicBodies(): boolean {\n        return this._applyImpulsesToDynamicBodies;\n    }\n\n    public setApplyImpulsesToDynamicBodies(enabled: boolean) {\n        this._applyImpulsesToDynamicBodies = enabled;\n    }\n\n    /**\n     * Returns the custom value of the character mass, if it was set by `this.setCharacterMass`.\n     */\n    public characterMass(): number | null {\n        return this._characterMass;\n    }\n\n    /**\n     * Set the mass of the character to be used for impulse resolution if `self.applyImpulsesToDynamicBodies`\n     * is set to `true`.\n     *\n     * If no character mass is set explicitly (or if it is set to `null`) it is automatically assumed to be equal\n     * to the mass of the rigid-body the character collider is attached to; or equal to 0 if the character collider\n     * isn’t attached to any rigid-body.\n     *\n     * @param mass - The mass to set.\n     */\n    public setCharacterMass(mass: number | null) {\n        this._characterMass = mass;\n    }\n\n    /**\n     * A small gap to preserve between the character and its surroundings.\n     *\n     * This value should not be too large to avoid visual artifacts, but shouldn’t be too small\n     * (must not be zero) to improve numerical stability of the character controller.\n     */\n    public offset(): number {\n        return this.raw.offset();\n    }\n\n    /**\n     * Sets a small gap to preserve between the character and its surroundings.\n     *\n     * This value should not be too large to avoid visual artifacts, but shouldn’t be too small\n     * (must not be zero) to improve numerical stability of the character controller.\n     */\n    public setOffset(value: number) {\n        this.raw.setOffset(value);\n    }\n\n    /// Increase this number if your character appears to get stuck when sliding against surfaces.\n    ///\n    /// This is a small distance applied to the movement toward the contact normals of shapes hit\n    /// by the character controller. This helps shape-casting not getting stuck in an always-penetrating\n    /// state during the sliding calculation.\n    ///\n    /// This value should remain fairly small since it can introduce artificial \"bumps\" when sliding\n    /// along a flat surface.\n    public normalNudgeFactor(): number {\n        return this.raw.normalNudgeFactor();\n    }\n\n    /// Increase this number if your character appears to get stuck when sliding against surfaces.\n    ///\n    /// This is a small distance applied to the movement toward the contact normals of shapes hit\n    /// by the character controller. This helps shape-casting not getting stuck in an always-penetrating\n    /// state during the sliding calculation.\n    ///\n    /// This value should remain fairly small since it can introduce artificial \"bumps\" when sliding\n    /// along a flat surface.\n    public setNormalNudgeFactor(value: number) {\n        this.raw.setNormalNudgeFactor(value);\n    }\n\n    /**\n     * Is sliding against obstacles enabled?\n     */\n    public slideEnabled(): boolean {\n        return this.raw.slideEnabled();\n    }\n\n    /**\n     * Enable or disable sliding against obstacles.\n     */\n    public setSlideEnabled(enabled: boolean) {\n        this.raw.setSlideEnabled(enabled);\n    }\n\n    /**\n     * The maximum step height a character can automatically step over.\n     */\n    public autostepMaxHeight(): number | null {\n        return this.raw.autostepMaxHeight();\n    }\n\n    /**\n     * The minimum width of free space that must be available after stepping on a stair.\n     */\n    public autostepMinWidth(): number | null {\n        return this.raw.autostepMinWidth();\n    }\n\n    /**\n     * Can the character automatically step over dynamic bodies too?\n     */\n    public autostepIncludesDynamicBodies(): boolean | null {\n        return this.raw.autostepIncludesDynamicBodies();\n    }\n\n    /**\n     * Is automatically stepping over small objects enabled?\n     */\n    public autostepEnabled(): boolean {\n        return this.raw.autostepEnabled();\n    }\n\n    /**\n     * Enabled automatically stepping over small objects.\n     *\n     * @param maxHeight - The maximum step height a character can automatically step over.\n     * @param minWidth - The minimum width of free space that must be available after stepping on a stair.\n     * @param includeDynamicBodies - Can the character automatically step over dynamic bodies too?\n     */\n    public enableAutostep(\n        maxHeight: number,\n        minWidth: number,\n        includeDynamicBodies: boolean,\n    ) {\n        this.raw.enableAutostep(maxHeight, minWidth, includeDynamicBodies);\n    }\n\n    /**\n     * Disable automatically stepping over small objects.\n     */\n    public disableAutostep() {\n        return this.raw.disableAutostep();\n    }\n\n    /**\n     * The maximum angle (radians) between the floor’s normal and the `up` vector that the\n     * character is able to climb.\n     */\n    public maxSlopeClimbAngle(): number {\n        return this.raw.maxSlopeClimbAngle();\n    }\n\n    /**\n     * Sets the maximum angle (radians) between the floor’s normal and the `up` vector that the\n     * character is able to climb.\n     */\n    public setMaxSlopeClimbAngle(angle: number) {\n        this.raw.setMaxSlopeClimbAngle(angle);\n    }\n\n    /**\n     * The minimum angle (radians) between the floor’s normal and the `up` vector before the\n     * character starts to slide down automatically.\n     */\n    public minSlopeSlideAngle(): number {\n        return this.raw.minSlopeSlideAngle();\n    }\n\n    /**\n     * Sets the minimum angle (radians) between the floor’s normal and the `up` vector before the\n     * character starts to slide down automatically.\n     */\n    public setMinSlopeSlideAngle(angle: number) {\n        this.raw.setMinSlopeSlideAngle(angle);\n    }\n\n    /**\n     * If snap-to-ground is enabled, should the character be automatically snapped to the ground if\n     * the distance between the ground and its feet are smaller than the specified threshold?\n     */\n    public snapToGroundDistance(): number | null {\n        return this.raw.snapToGroundDistance();\n    }\n\n    /**\n     * Enables automatically snapping the character to the ground if the distance between\n     * the ground and its feet are smaller than the specified threshold.\n     */\n    public enableSnapToGround(distance: number) {\n        this.raw.enableSnapToGround(distance);\n    }\n\n    /**\n     * Disables automatically snapping the character to the ground.\n     */\n    public disableSnapToGround() {\n        this.raw.disableSnapToGround();\n    }\n\n    /**\n     * Is automatically snapping the character to the ground enabled?\n     */\n    public snapToGroundEnabled(): boolean {\n        return this.raw.snapToGroundEnabled();\n    }\n\n    /**\n     * Computes the movement the given collider is able to execute after hitting and sliding on obstacles.\n     *\n     * @param collider - The collider to move.\n     * @param desiredTranslationDelta - The desired collider movement.\n     * @param filterFlags - Flags for excluding whole subsets of colliders from the obstacles taken into account.\n     * @param filterGroups - Groups for excluding colliders with incompatible collision groups from the obstacles\n     *                       taken into account.\n     * @param filterPredicate - Any collider for which this closure returns `false` will be excluded from the\n     *                          obstacles taken into account.\n     */\n    public computeColliderMovement(\n        collider: Collider,\n        desiredTranslationDelta: Vector,\n        filterFlags?: QueryFilterFlags,\n        filterGroups?: InteractionGroups,\n        filterPredicate?: (collider: Collider) => boolean,\n    ) {\n        let rawTranslationDelta = VectorOps.intoRaw(desiredTranslationDelta);\n        this.raw.computeColliderMovement(\n            this.params.dt,\n            this.broadPhase.raw,\n            this.narrowPhase.raw,\n            this.bodies.raw,\n            this.colliders.raw,\n            collider.handle,\n            rawTranslationDelta,\n            this._applyImpulsesToDynamicBodies,\n            this._characterMass,\n            filterFlags,\n            filterGroups,\n            this.colliders.castClosure(filterPredicate),\n        );\n        rawTranslationDelta.free();\n    }\n\n    /**\n     * The movement computed by the last call to `this.computeColliderMovement`.\n     */\n    public computedMovement(target?: Vector): Vector {\n        this.raw.computedMovement(scratchBuffer);\n        return VectorOps.fromBuffer(scratchBuffer, target);\n    }\n\n    /**\n     * The result of ground detection computed by the last call to `this.computeColliderMovement`.\n     */\n    public computedGrounded(): boolean {\n        return this.raw.computedGrounded();\n    }\n\n    /**\n     * The number of collisions against obstacles detected along the path of the last call\n     * to `this.computeColliderMovement`.\n     */\n    public numComputedCollisions(): number {\n        return this.raw.numComputedCollisions();\n    }\n\n    /**\n     * Returns the collision against one of the obstacles detected along the path of the last\n     * call to `this.computeColliderMovement`.\n     *\n     * @param i - The i-th collision will be returned.\n     * @param out - If this argument is set, it will be filled with the collision information.\n     */\n    public computedCollision(\n        i: number,\n        out?: CharacterCollision,\n    ): CharacterCollision | null {\n        if (!this.raw.computedCollision(i, this.rawCharacterCollision)) {\n            return null;\n        } else {\n            let c = this.rawCharacterCollision;\n            out = out ?? new CharacterCollision();\n            c.translationDeltaApplied(scratchBuffer);\n            out.translationDeltaApplied = VectorOps.fromBuffer(\n                scratchBuffer,\n                out.translationDeltaApplied,\n            );\n            c.translationDeltaRemaining(scratchBuffer);\n            out.translationDeltaRemaining = VectorOps.fromBuffer(\n                scratchBuffer,\n                out.translationDeltaRemaining,\n            );\n            out.toi = c.toi();\n            c.worldWitness1(scratchBuffer);\n            out.witness1 = VectorOps.fromBuffer(scratchBuffer, out.witness1);\n            c.worldWitness2(scratchBuffer);\n            out.witness2 = VectorOps.fromBuffer(scratchBuffer, out.witness2);\n            c.worldNormal1(scratchBuffer);\n            out.normal1 = VectorOps.fromBuffer(scratchBuffer, out.normal1);\n            c.worldNormal2(scratchBuffer);\n            out.normal2 = VectorOps.fromBuffer(scratchBuffer, out.normal2);\n            out.collider = this.colliders.get(c.handle());\n            return out;\n        }\n    }\n}\n","import {RawDynamicRayCastVehicleController} from \"../raw\";\nimport {scratchBuffer, Vector, VectorOps} from \"../math\";\nimport {\n    BroadPhase,\n    Collider,\n    ColliderSet,\n    InteractionGroups,\n    NarrowPhase,\n} from \"../geometry\";\nimport {QueryFilterFlags} from \"../pipeline\";\nimport {RigidBody, RigidBodyHandle, RigidBodySet} from \"../dynamics\";\n\n/**\n * A character controller to simulate vehicles using ray-casting for the wheels.\n */\nexport class DynamicRayCastVehicleController {\n    private raw: RawDynamicRayCastVehicleController;\n    private broadPhase: BroadPhase;\n    private narrowPhase: NarrowPhase;\n    private bodies: RigidBodySet;\n    private colliders: ColliderSet;\n    private _chassis: RigidBody;\n\n    constructor(\n        chassis: RigidBody,\n        broadPhase: BroadPhase,\n        narrowPhase: NarrowPhase,\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n    ) {\n        this.raw = new RawDynamicRayCastVehicleController(chassis.handle);\n        this.broadPhase = broadPhase;\n        this.narrowPhase = narrowPhase;\n        this.bodies = bodies;\n        this.colliders = colliders;\n        this._chassis = chassis;\n    }\n\n    /** @internal */\n    public free() {\n        if (!!this.raw) {\n            this.raw.free();\n        }\n\n        this.raw = undefined;\n    }\n\n    /**\n     * Updates the vehicle’s velocity based on its suspension, engine force, and brake.\n     *\n     * This directly updates the velocity of its chassis rigid-body.\n     *\n     * @param dt - Time increment used to integrate forces.\n     * @param filterFlags - Flag to exclude categories of objects from the wheels’ ray-cast.\n     * @param filterGroups - Only colliders compatible with these groups will be hit by the wheels’ ray-casts.\n     * @param filterPredicate - Callback to filter out which collider will be hit by the wheels’ ray-casts.\n     */\n    public updateVehicle(\n        dt: number,\n        filterFlags?: QueryFilterFlags,\n        filterGroups?: InteractionGroups,\n        filterPredicate?: (collider: Collider) => boolean,\n    ) {\n        this.raw.update_vehicle(\n            dt,\n            this.broadPhase.raw,\n            this.narrowPhase.raw,\n            this.bodies.raw,\n            this.colliders.raw,\n            filterFlags,\n            filterGroups,\n            this.colliders.castClosure(filterPredicate),\n        );\n    }\n\n    /**\n     * The current forward speed of the vehicle.\n     */\n    public currentVehicleSpeed(): number {\n        return this.raw.current_vehicle_speed();\n    }\n\n    /**\n     * The rigid-body used as the chassis.\n     */\n    public chassis(): RigidBody {\n        return this._chassis;\n    }\n\n    /**\n     * The chassis’ local _up_ direction (`0 = x, 1 = y, 2 = z`).\n     */\n    get indexUpAxis(): number {\n        return this.raw.index_up_axis();\n    }\n\n    /**\n     * Sets the chassis’ local _up_ direction (`0 = x, 1 = y, 2 = z`).\n     */\n    set indexUpAxis(axis: number) {\n        this.raw.set_index_up_axis(axis);\n    }\n\n    /**\n     * The chassis’ local _forward_ direction (`0 = x, 1 = y, 2 = z`).\n     */\n    get indexForwardAxis(): number {\n        return this.raw.index_forward_axis();\n    }\n\n    /**\n     * Sets the chassis’ local _forward_ direction (`0 = x, 1 = y, 2 = z`).\n     */\n    set setIndexForwardAxis(axis: number) {\n        this.raw.set_index_forward_axis(axis);\n    }\n\n    /**\n     * Adds a new wheel attached to this vehicle.\n     * @param chassisConnectionCs  - The position of the wheel relative to the chassis.\n     * @param directionCs - The direction of the wheel’s suspension, relative to the chassis. The ray-casting will\n     *                      happen following this direction to detect the ground.\n     * @param axleCs - The wheel’s axle axis, relative to the chassis.\n     * @param suspensionRestLength - The rest length of the wheel’s suspension spring.\n     * @param radius - The wheel’s radius.\n     */\n    public addWheel(\n        chassisConnectionCs: Vector,\n        directionCs: Vector,\n        axleCs: Vector,\n        suspensionRestLength: number,\n        radius: number,\n    ) {\n        let rawChassisConnectionCs = VectorOps.intoRaw(chassisConnectionCs);\n        let rawDirectionCs = VectorOps.intoRaw(directionCs);\n        let rawAxleCs = VectorOps.intoRaw(axleCs);\n\n        this.raw.add_wheel(\n            rawChassisConnectionCs,\n            rawDirectionCs,\n            rawAxleCs,\n            suspensionRestLength,\n            radius,\n        );\n\n        rawChassisConnectionCs.free();\n        rawDirectionCs.free();\n        rawAxleCs.free();\n    }\n\n    /**\n     * The number of wheels attached to this vehicle.\n     */\n    public numWheels(): number {\n        return this.raw.num_wheels();\n    }\n\n    /*\n     *\n     * Access to wheel properties.\n     *\n     */\n    /*\n     * Getters + setters\n     */\n\n    /**\n     * The position of the i-th wheel, relative to the chassis.\n     *\n     * @param {number} i\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public wheelChassisConnectionPointCs(\n        i: number,\n        target?: Vector,\n    ): Vector | null {\n        const exists = this.raw.wheel_chassis_connection_point_cs(\n            i,\n            scratchBuffer,\n        );\n        return exists ? VectorOps.fromBuffer(scratchBuffer, target) : null;\n    }\n\n    /**\n     * Sets the position of the i-th wheel, relative to the chassis.\n     */\n    public setWheelChassisConnectionPointCs(i: number, value: Vector) {\n        let rawValue = VectorOps.intoRaw(value);\n        this.raw.set_wheel_chassis_connection_point_cs(i, rawValue);\n        rawValue.free();\n    }\n\n    /**\n     * The rest length of the i-th wheel’s suspension spring.\n     */\n    public wheelSuspensionRestLength(i: number): number | null {\n        return this.raw.wheel_suspension_rest_length(i);\n    }\n\n    /**\n     * Sets the rest length of the i-th wheel’s suspension spring.\n     */\n    public setWheelSuspensionRestLength(i: number, value: number) {\n        this.raw.set_wheel_suspension_rest_length(i, value);\n    }\n\n    /**\n     * The maximum distance the i-th wheel suspension can travel before and after its resting length.\n     */\n    public wheelMaxSuspensionTravel(i: number): number | null {\n        return this.raw.wheel_max_suspension_travel(i);\n    }\n\n    /**\n     * Sets the maximum distance the i-th wheel suspension can travel before and after its resting length.\n     */\n    public setWheelMaxSuspensionTravel(i: number, value: number) {\n        this.raw.set_wheel_max_suspension_travel(i, value);\n    }\n\n    /**\n     * The i-th wheel’s radius.\n     */\n    public wheelRadius(i: number): number | null {\n        return this.raw.wheel_radius(i);\n    }\n\n    /**\n     * Sets the i-th wheel’s radius.\n     */\n    public setWheelRadius(i: number, value: number) {\n        this.raw.set_wheel_radius(i, value);\n    }\n\n    /**\n     * The i-th wheel’s suspension stiffness.\n     *\n     * Increase this value if the suspension appears to not push the vehicle strong enough.\n     */\n    public wheelSuspensionStiffness(i: number): number | null {\n        return this.raw.wheel_suspension_stiffness(i);\n    }\n\n    /**\n     * Sets the i-th wheel’s suspension stiffness.\n     *\n     * Increase this value if the suspension appears to not push the vehicle strong enough.\n     */\n    public setWheelSuspensionStiffness(i: number, value: number) {\n        this.raw.set_wheel_suspension_stiffness(i, value);\n    }\n\n    /**\n     * The i-th wheel’s suspension’s damping when it is being compressed.\n     */\n    public wheelSuspensionCompression(i: number): number | null {\n        return this.raw.wheel_suspension_compression(i);\n    }\n\n    /**\n     * The i-th wheel’s suspension’s damping when it is being compressed.\n     */\n    public setWheelSuspensionCompression(i: number, value: number) {\n        this.raw.set_wheel_suspension_compression(i, value);\n    }\n\n    /**\n     * The i-th wheel’s suspension’s damping when it is being released.\n     *\n     * Increase this value if the suspension appears to overshoot.\n     */\n    public wheelSuspensionRelaxation(i: number): number | null {\n        return this.raw.wheel_suspension_relaxation(i);\n    }\n\n    /**\n     * Sets the i-th wheel’s suspension’s damping when it is being released.\n     *\n     * Increase this value if the suspension appears to overshoot.\n     */\n    public setWheelSuspensionRelaxation(i: number, value: number) {\n        this.raw.set_wheel_suspension_relaxation(i, value);\n    }\n\n    /**\n     * The maximum force applied by the i-th wheel’s suspension.\n     */\n    public wheelMaxSuspensionForce(i: number): number | null {\n        return this.raw.wheel_max_suspension_force(i);\n    }\n\n    /**\n     * Sets the maximum force applied by the i-th wheel’s suspension.\n     */\n    public setWheelMaxSuspensionForce(i: number, value: number) {\n        this.raw.set_wheel_max_suspension_force(i, value);\n    }\n\n    /**\n     * The maximum amount of braking impulse applied on the i-th wheel to slow down the vehicle.\n     */\n    public wheelBrake(i: number): number | null {\n        return this.raw.wheel_brake(i);\n    }\n\n    /**\n     * Set the maximum amount of braking impulse applied on the i-th wheel to slow down the vehicle.\n     */\n    public setWheelBrake(i: number, value: number) {\n        this.raw.set_wheel_brake(i, value);\n    }\n\n    /**\n     * The steering angle (radians) for the i-th wheel.\n     */\n    public wheelSteering(i: number): number | null {\n        return this.raw.wheel_steering(i);\n    }\n\n    /**\n     * Sets the steering angle (radians) for the i-th wheel.\n     */\n    public setWheelSteering(i: number, value: number) {\n        this.raw.set_wheel_steering(i, value);\n    }\n\n    /**\n     * The forward force applied by the i-th wheel on the chassis.\n     */\n    public wheelEngineForce(i: number): number | null {\n        return this.raw.wheel_engine_force(i);\n    }\n\n    /**\n     * Sets the forward force applied by the i-th wheel on the chassis.\n     */\n    public setWheelEngineForce(i: number, value: number) {\n        this.raw.set_wheel_engine_force(i, value);\n    }\n\n    /**\n     * The direction of the i-th wheel’s suspension, relative to the chassis.\n     *\n     * The ray-casting will happen following this direction to detect the ground.\n     *\n     * @param {number} i\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public wheelDirectionCs(i: number, target?: Vector): Vector | null {\n        const exists = this.raw.wheel_direction_cs(i, scratchBuffer);\n        return exists ? VectorOps.fromBuffer(scratchBuffer, target) : null;\n    }\n\n    /**\n     * Sets the direction of the i-th wheel’s suspension, relative to the chassis.\n     *\n     * The ray-casting will happen following this direction to detect the ground.\n     */\n    public setWheelDirectionCs(i: number, value: Vector) {\n        let rawValue = VectorOps.intoRaw(value);\n        this.raw.set_wheel_direction_cs(i, rawValue);\n        rawValue.free();\n    }\n\n    /**\n     * The i-th wheel’s axle axis, relative to the chassis.\n     *\n     * The axis index defined as 0 = X, 1 = Y, 2 = Z.\n     *\n     * @param {number} i\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public wheelAxleCs(i: number, target?: Vector): Vector | null {\n        const exists = this.raw.wheel_axle_cs(i, scratchBuffer);\n        return exists ? VectorOps.fromBuffer(scratchBuffer, target) : null;\n    }\n\n    /**\n     * Sets the i-th wheel’s axle axis, relative to the chassis.\n     *\n     * The axis index defined as 0 = X, 1 = Y, 2 = Z.\n     */\n    public setWheelAxleCs(i: number, value: Vector) {\n        let rawValue = VectorOps.intoRaw(value);\n        this.raw.set_wheel_axle_cs(i, rawValue);\n        rawValue.free();\n    }\n\n    /**\n     * Parameter controlling how much traction the tire has.\n     *\n     * The larger the value, the more instantaneous braking will happen (with the risk of\n     * causing the vehicle to flip if it’s too strong).\n     */\n    public wheelFrictionSlip(i: number): number | null {\n        return this.raw.wheel_friction_slip(i);\n    }\n\n    /**\n     * Sets the parameter controlling how much traction the tire has.\n     *\n     * The larger the value, the more instantaneous braking will happen (with the risk of\n     * causing the vehicle to flip if it’s too strong).\n     */\n    public setWheelFrictionSlip(i: number, value: number) {\n        this.raw.set_wheel_friction_slip(i, value);\n    }\n\n    /**\n     * The multiplier of friction between a tire and the collider it’s on top of.\n     *\n     * The larger the value, the stronger side friction will be.\n     */\n    public wheelSideFrictionStiffness(i: number): number | null {\n        return this.raw.wheel_side_friction_stiffness(i);\n    }\n\n    /**\n     * The multiplier of friction between a tire and the collider it’s on top of.\n     *\n     * The larger the value, the stronger side friction will be.\n     */\n    public setWheelSideFrictionStiffness(i: number, value: number) {\n        this.raw.set_wheel_side_friction_stiffness(i, value);\n    }\n\n    /*\n     * Getters only.\n     */\n\n    /**\n     *  The i-th wheel’s current rotation angle (radians) on its axle.\n     */\n    public wheelRotation(i: number): number | null {\n        return this.raw.wheel_rotation(i);\n    }\n\n    /**\n     *  The forward impulses applied by the i-th wheel on the chassis.\n     */\n    public wheelForwardImpulse(i: number): number | null {\n        return this.raw.wheel_forward_impulse(i);\n    }\n\n    /**\n     *  The side impulses applied by the i-th wheel on the chassis.\n     */\n    public wheelSideImpulse(i: number): number | null {\n        return this.raw.wheel_side_impulse(i);\n    }\n\n    /**\n     *  The force applied by the i-th wheel suspension.\n     */\n    public wheelSuspensionForce(i: number): number | null {\n        return this.raw.wheel_suspension_force(i);\n    }\n\n    /**\n     *  The (world-space) contact normal between the i-th wheel and the floor.\n     *\n     * @param {number} i\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public wheelContactNormal(i: number, target?: Vector): Vector | null {\n        const exists = this.raw.wheel_contact_normal_ws(i, scratchBuffer);\n        return exists ? VectorOps.fromBuffer(scratchBuffer, target) : null;\n    }\n\n    /**\n     *  The (world-space) point hit by the wheel’s ray-cast for the i-th wheel.\n     *\n     * @param {number} i\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public wheelContactPoint(i: number, target?: Vector): Vector | null {\n        const exists = this.raw.wheel_contact_point_ws(i, scratchBuffer);\n        return exists ? VectorOps.fromBuffer(scratchBuffer, target) : null;\n    }\n\n    /**\n     *  The suspension length for the i-th wheel.\n     */\n    public wheelSuspensionLength(i: number): number | null {\n        return this.raw.wheel_suspension_length(i);\n    }\n\n    /**\n     *  The (world-space) starting point of the ray-cast for the i-th wheel.\n     *\n     * @param {number} i\n     * @param {Vector?} target - The object to be populated. If provided,\n     * the function returns this object instead of creating a new one.\n     */\n    public wheelHardPoint(i: number, target?: Vector): Vector | null {\n        const exists = this.raw.wheel_hard_point_ws(i, scratchBuffer);\n        return exists ? VectorOps.fromBuffer(scratchBuffer, target) : null;\n    }\n\n    /**\n     *  Is the i-th wheel in contact with the ground?\n     */\n    public wheelIsInContact(i: number): boolean {\n        return this.raw.wheel_is_in_contact(i);\n    }\n\n    /**\n     *  The collider hit by the ray-cast for the i-th wheel.\n     */\n    public wheelGroundObject(i: number): Collider | null {\n        return this.colliders.get(this.raw.wheel_ground_object(i));\n    }\n}\n","import {\n    RawBroadPhase,\n    RawCCDSolver,\n    RawColliderSet,\n    RawDeserializedWorld,\n    RawIntegrationParameters,\n    RawIslandManager,\n    RawImpulseJointSet,\n    RawMultibodyJointSet,\n    RawNarrowPhase,\n    RawPhysicsPipeline,\n    RawRigidBodySet,\n    RawSerializationPipeline,\n    RawDebugRenderPipeline,\n    RawSoftBodySet,\n} from \"../raw\";\n\nimport {\n    BroadPhase,\n    Collider,\n    ColliderDesc,\n    ColliderHandle,\n    ColliderSet,\n    InteractionGroups,\n    NarrowPhase,\n    PointColliderProjection,\n    Ray,\n    RayColliderIntersection,\n    RayColliderHit,\n    Shape,\n    ColliderShapeCastHit,\n    TempContactManifold,\n} from \"../geometry\";\nimport {\n    CCDSolver,\n    IntegrationParameters,\n    IslandManager,\n    ImpulseJoint,\n    ImpulseJointHandle,\n    MultibodyJoint,\n    MultibodyJointHandle,\n    JointData,\n    ImpulseJointSet,\n    MultibodyJointSet,\n    RigidBody,\n    RigidBodyDesc,\n    RigidBodyHandle,\n    RigidBodySet,\n    SoftBody,\n    SoftBodyDesc,\n    SoftBodyHandle,\n    SoftBodySet,\n    SoftBodyTearEvent,\n    SoftMeshBinding,\n} from \"../dynamics\";\nimport {Rotation, Vector, VectorOps} from \"../math\";\nimport {PhysicsPipeline} from \"./physics_pipeline\";\nimport {QueryFilterFlags} from \"./query_pipeline\";\nimport {SerializationPipeline} from \"./serialization_pipeline\";\nimport {EventQueue} from \"./event_queue\";\nimport {PhysicsHooks} from \"./physics_hooks\";\nimport {DebugRenderBuffers, DebugRenderPipeline} from \"./debug_render_pipeline\";\nimport {\n    KinematicCharacterController,\n    PidAxesMask,\n    PidController,\n} from \"../control\";\nimport {Coarena} from \"../coarena\";\n\n// #if DIM3\nimport {DynamicRayCastVehicleController} from \"../control\";\n\n// #endif\n\n/**\n * The physics world.\n *\n * This contains all the data-structures necessary for creating and simulating\n * bodies with contacts, joints, and external forces.\n */\nexport class World {\n    public gravity: Vector;\n    integrationParameters: IntegrationParameters;\n    islands: IslandManager;\n    broadPhase: BroadPhase;\n    narrowPhase: NarrowPhase;\n    bodies: RigidBodySet;\n    colliders: ColliderSet;\n    impulseJoints: ImpulseJointSet;\n    multibodyJoints: MultibodyJointSet;\n    softBodies: SoftBodySet;\n    ccdSolver: CCDSolver;\n    physicsPipeline: PhysicsPipeline;\n    serializationPipeline: SerializationPipeline;\n    debugRenderPipeline: DebugRenderPipeline;\n    characterControllers: Set<KinematicCharacterController>;\n    pidControllers: Set<PidController>;\n\n    // #if DIM3\n    vehicleControllers: Set<DynamicRayCastVehicleController>;\n\n    // #endif\n\n    /**\n     * Release the WASM memory occupied by this physics world.\n     *\n     * All the fields of this physics world will be freed as well,\n     * so there is no need to call their `.free()` methods individually.\n     */\n    public free() {\n        this.integrationParameters.free();\n        this.islands.free();\n        this.broadPhase.free();\n        this.narrowPhase.free();\n        this.bodies.free();\n        this.colliders.free();\n        this.impulseJoints.free();\n        this.multibodyJoints.free();\n        this.softBodies.free();\n        this.ccdSolver.free();\n        this.physicsPipeline.free();\n        this.serializationPipeline.free();\n        this.debugRenderPipeline.free();\n        this.characterControllers.forEach((controller) => controller.free());\n        this.pidControllers.forEach((controller) => controller.free());\n\n        // #if DIM3\n        this.vehicleControllers.forEach((controller) => controller.free());\n        // #endif\n\n        this.integrationParameters = undefined;\n        this.islands = undefined;\n        this.broadPhase = undefined;\n        this.narrowPhase = undefined;\n        this.bodies = undefined;\n        this.colliders = undefined;\n        this.ccdSolver = undefined;\n        this.impulseJoints = undefined;\n        this.multibodyJoints = undefined;\n        this.softBodies = undefined;\n        this.physicsPipeline = undefined;\n        this.serializationPipeline = undefined;\n        this.debugRenderPipeline = undefined;\n        this.characterControllers = undefined;\n        this.pidControllers = undefined;\n\n        // #if DIM3\n        this.vehicleControllers = undefined;\n        // #endif\n    }\n\n    constructor(\n        gravity: Vector,\n        rawIntegrationParameters?: RawIntegrationParameters,\n        rawIslands?: RawIslandManager,\n        rawBroadPhase?: RawBroadPhase,\n        rawNarrowPhase?: RawNarrowPhase,\n        rawBodies?: RawRigidBodySet,\n        rawColliders?: RawColliderSet,\n        rawSoftBodies?: RawSoftBodySet,\n        rawImpulseJoints?: RawImpulseJointSet,\n        rawMultibodyJoints?: RawMultibodyJointSet,\n        rawCCDSolver?: RawCCDSolver,\n        rawPhysicsPipeline?: RawPhysicsPipeline,\n        rawSerializationPipeline?: RawSerializationPipeline,\n        rawDebugRenderPipeline?: RawDebugRenderPipeline,\n    ) {\n        this.gravity = gravity;\n        this.integrationParameters = new IntegrationParameters(\n            rawIntegrationParameters,\n        );\n        this.islands = new IslandManager(rawIslands);\n        this.broadPhase = new BroadPhase(rawBroadPhase);\n        this.narrowPhase = new NarrowPhase(rawNarrowPhase);\n        this.bodies = new RigidBodySet(rawBodies);\n        this.colliders = new ColliderSet(rawColliders);\n        this.impulseJoints = new ImpulseJointSet(rawImpulseJoints);\n        this.multibodyJoints = new MultibodyJointSet(rawMultibodyJoints);\n        this.softBodies = new SoftBodySet(rawSoftBodies);\n        this.ccdSolver = new CCDSolver(rawCCDSolver);\n        this.physicsPipeline = new PhysicsPipeline(rawPhysicsPipeline);\n        this.serializationPipeline = new SerializationPipeline(\n            rawSerializationPipeline,\n        );\n        this.debugRenderPipeline = new DebugRenderPipeline(\n            rawDebugRenderPipeline,\n        );\n        this.characterControllers = new Set<KinematicCharacterController>();\n        this.pidControllers = new Set<PidController>();\n\n        // #if DIM3\n        this.vehicleControllers = new Set<DynamicRayCastVehicleController>();\n        // #endif\n\n        this.impulseJoints.finalizeDeserialization(this.bodies);\n        this.bodies.finalizeDeserialization(this.colliders);\n        this.colliders.finalizeDeserialization(this.bodies);\n        this.softBodies.finalizeDeserialization(this.bodies, this.colliders);\n    }\n\n    public static fromRaw(raw: RawDeserializedWorld): World {\n        if (!raw) return null;\n\n        return new World(\n            VectorOps.fromRaw(raw.takeGravity()),\n            raw.takeIntegrationParameters(),\n            raw.takeIslandManager(),\n            raw.takeBroadPhase(),\n            raw.takeNarrowPhase(),\n            raw.takeBodies(),\n            raw.takeColliders(),\n            raw.takeSoftBodies(),\n            raw.takeImpulseJoints(),\n            raw.takeMultibodyJoints(),\n        );\n    }\n\n    /**\n     * Takes a snapshot of this world.\n     *\n     * Use `World.restoreSnapshot` to create a new physics world with a state identical to\n     * the state when `.takeSnapshot()` is called.\n     */\n    public takeSnapshot(): Uint8Array {\n        return this.serializationPipeline.serializeAll(\n            this.gravity,\n            this.integrationParameters,\n            this.islands,\n            this.broadPhase,\n            this.narrowPhase,\n            this.bodies,\n            this.colliders,\n            this.softBodies,\n            this.impulseJoints,\n            this.multibodyJoints,\n        );\n    }\n\n    /**\n     * Creates a new physics world from a snapshot.\n     *\n     * This new physics world will be an identical copy of the snapshoted physics world.\n     */\n    public static restoreSnapshot(data: Uint8Array): World {\n        let deser = new SerializationPipeline();\n        return deser.deserializeAll(data);\n    }\n\n    /**\n     * Computes all the lines (and their colors) needed to render the scene.\n     *\n     * @param filterFlags - Flags for excluding whole subsets of colliders from rendering.\n     * @param filterPredicate - Any collider for which this closure returns `false` will be excluded from the\n     *                          debug rendering.\n     */\n    public debugRender(\n        filterFlags?: QueryFilterFlags,\n        filterPredicate?: (collider: Collider) => boolean,\n    ): DebugRenderBuffers {\n        this.debugRenderPipeline.render(\n            this.bodies,\n            this.colliders,\n            this.softBodies,\n            this.impulseJoints,\n            this.multibodyJoints,\n            this.narrowPhase,\n            filterFlags,\n            filterPredicate,\n        );\n        return new DebugRenderBuffers(\n            this.debugRenderPipeline.vertices,\n            this.debugRenderPipeline.colors,\n        );\n    }\n\n    /**\n     * Advance the simulation by one time step.\n     *\n     * All events generated by the physics engine are ignored.\n     *\n     * @param EventQueue - (optional) structure responsible for collecting\n     *   events generated by the physics engine.\n     */\n    public step(eventQueue?: EventQueue, hooks?: PhysicsHooks) {\n        this.physicsPipeline.step(\n            this.gravity,\n            this.integrationParameters,\n            this.islands,\n            this.broadPhase,\n            this.narrowPhase,\n            this.bodies,\n            this.colliders,\n            this.softBodies,\n            this.impulseJoints,\n            this.multibodyJoints,\n            this.ccdSolver,\n            eventQueue,\n            hooks,\n        );\n        // Tears split pieces off into soft bodies of their own, with proxies and colliders.\n        this.mapNewSoftBodies();\n    }\n\n    /**\n     * Wraps the soft bodies, rigid-body proxies and colliders the engine created on its own\n     * during the last step (the pieces tears split off), and drops the wrappers of what it\n     * removed. Called by `World.step`.\n     */\n    public mapNewSoftBodies() {\n        this.softBodies.mapNewSoftBodies(this.bodies, this.colliders);\n        this.bodies.mapNewBodies(this.colliders);\n        this.colliders.mapNewColliders(this.bodies);\n        this.bodies.unmapRemovedBodies();\n        this.colliders.unmapRemovedColliders();\n        this.impulseJoints.unmapRemovedJoints();\n        this.multibodyJoints.unmapRemovedJoints();\n    }\n\n    /**\n     * Update colliders positions after rigid-bodies moved.\n     *\n     * When a rigid-body moves, the positions of the colliders attached to it need to be updated. This update is\n     * generally automatically done at the beginning and the end of each simulation step with World.step.\n     * If the positions need to be updated without running a simulation step this method can be called manually.\n     */\n    public propagateModifiedBodyPositionsToColliders() {\n        this.bodies.raw.propagateModifiedBodyPositionsToColliders(\n            this.colliders.raw,\n        );\n    }\n\n    // TODO: This needs to trigger a broad-phase update but without emitting collision events?\n    // /**\n    //  * Ensure subsequent scene queries take into account the collider positions set before this method is called.\n    //  *\n    //  * This does not step the physics simulation forward.\n    //  */\n    // public updateSceneQueries() {\n    //     this.propagateModifiedBodyPositionsToColliders();\n    //     this.queryPipeline.update(this.colliders);\n    // }\n\n    /**\n     * The current simulation timestep.\n     */\n    get timestep(): number {\n        return this.integrationParameters.dt;\n    }\n\n    /**\n     * Sets the new simulation timestep.\n     *\n     * The simulation timestep governs by how much the physics state of the world will\n     * be integrated. A simulation timestep should:\n     * - be as small as possible. Typical values evolve around 0.016 (assuming the chosen unit is milliseconds,\n     * corresponds to the time between two frames of a game running at 60FPS).\n     * - not vary too much during the course of the simulation. A timestep with large variations may\n     * cause instabilities in the simulation.\n     *\n     * @param dt - The timestep length, in seconds.\n     */\n    set timestep(dt: number) {\n        this.integrationParameters.dt = dt;\n    }\n\n    /**\n     * The approximate size of most dynamic objects in the scene.\n     *\n     * See the documentation of the `World.lengthUnit` setter for further details.\n     */\n    get lengthUnit(): number {\n        return this.integrationParameters.lengthUnit;\n    }\n\n    /**\n     * The approximate size of most dynamic objects in the scene.\n     *\n     * This value is used internally to estimate some length-based tolerance. In particular, the\n     * values `IntegrationParameters.allowedLinearError`,\n     * `IntegrationParameters.maxPenetrationCorrection`,\n     * `IntegrationParameters.predictionDistance`, `RigidBodyActivation.linearThreshold`\n     * are scaled by this value implicitly.\n     *\n     * This value can be understood as the number of units-per-meter in your physical world compared\n     * to a human-sized world in meter. For example, in a 2d game, if your typical object size is 100\n     * pixels, set the `[`Self::length_unit`]` parameter to 100.0. The physics engine will interpret\n     * it as if 100 pixels is equivalent to 1 meter in its various internal threshold.\n     * (default `1.0`).\n     */\n    set lengthUnit(unitsPerMeter: number) {\n        this.integrationParameters.lengthUnit = unitsPerMeter;\n    }\n\n    /**\n     * The number of solver iterations run by the constraints solver for calculating forces (default: `4`).\n     */\n    get numSolverIterations(): number {\n        return this.integrationParameters.numSolverIterations;\n    }\n\n    /**\n     * Sets the number of solver iterations run by the constraints solver for calculating forces (default: `4`).\n     *\n     * The greater this value is, the most rigid and realistic the physics simulation will be.\n     * However a greater number of iterations is more computationally intensive.\n     *\n     * @param niter - The new number of solver iterations.\n     */\n    set numSolverIterations(niter: number) {\n        this.integrationParameters.numSolverIterations = niter;\n    }\n\n    /**\n     * Number of internal Project Gauss Seidel (PGS) iterations run at each solver iteration (default: `1`).\n     */\n    get numInternalPgsIterations(): number {\n        return this.integrationParameters.numInternalPgsIterations;\n    }\n\n    /**\n     * Sets the Number of internal Project Gauss Seidel (PGS) iterations run at each solver iteration (default: `1`).\n     *\n     * Increasing this parameter will improve stability of the simulation. It will have a lesser effect than\n     * increasing `numSolverIterations` but is also less computationally expensive.\n     *\n     * @param niter - The new number of internal PGS iterations.\n     */\n    set numInternalPgsIterations(niter: number) {\n        this.integrationParameters.numInternalPgsIterations = niter;\n    }\n\n    /**\n     * The number of substeps continuous collision-detection can run (default: `1`).\n     */\n    get maxCcdSubsteps(): number {\n        return this.integrationParameters.maxCcdSubsteps;\n    }\n\n    /**\n     * Sets the number of substeps continuous collision-detection can run (default: `1`).\n     *\n     * CCD operates using a \"motion clamping\" mechanism where all fast-moving object trajectories will\n     * be truncated to their first impact on their path. The number of CCD substeps beyond 1 indicate how\n     * many times that trajectory will be updated and continued after a hit. This can results in smoother\n     * paths, but at a significant computational cost.\n     *\n     * @param niter - The new maximum number of CCD substeps. Setting to `0` disables CCD entirely.\n     */\n    set maxCcdSubsteps(substeps: number) {\n        this.integrationParameters.maxCcdSubsteps = substeps;\n    }\n\n    /**\n     * Creates a new rigid-body from the given rigid-body descriptor.\n     *\n     * @param body - The description of the rigid-body to create.\n     */\n    public createRigidBody(body: RigidBodyDesc): RigidBody {\n        return this.bodies.createRigidBody(this.colliders, body);\n    }\n\n    /**\n     * Creates a new character controller.\n     *\n     * @param offset - The artificial gap added between the character’s chape and its environment.\n     */\n    public createCharacterController(\n        offset: number,\n    ): KinematicCharacterController {\n        let controller = new KinematicCharacterController(\n            offset,\n            this.integrationParameters,\n            this.broadPhase,\n            this.narrowPhase,\n            this.bodies,\n            this.colliders,\n        );\n        this.characterControllers.add(controller);\n        return controller;\n    }\n\n    /**\n     * Removes a character controller from this world.\n     *\n     * @param controller - The character controller to remove.\n     */\n    public removeCharacterController(controller: KinematicCharacterController) {\n        this.characterControllers.delete(controller);\n        controller.free();\n    }\n\n    /**\n     * Creates a new PID (Proportional-Integral-Derivative) controller.\n     *\n     * @param kp - The Proportional gain applied to the instantaneous linear position errors.\n     *             This is usually set to a multiple of the inverse of simulation step time\n     *             (e.g. `60` if the delta-time is `1.0 / 60.0`).\n     * @param ki - The linear gain applied to the Integral part of the PID controller.\n     * @param kd - The Derivative gain applied to the instantaneous linear velocity errors.\n     *             This is usually set to a value in `[0.0, 1.0]` where `0.0` implies no damping\n     *             (no correction of velocity errors) and `1.0` implies complete damping (velocity errors\n     *             are corrected in a single simulation step).\n     * @param axes - The axes affected by this controller.\n     *               Only coordinate axes with a bit flags set to `true` will be taken into\n     *               account when calculating the errors and corrections.\n     */\n    public createPidController(\n        kp: number,\n        ki: number,\n        kd: number,\n        axes: PidAxesMask,\n    ): PidController {\n        let controller = new PidController(\n            this.integrationParameters,\n            this.bodies,\n            kp,\n            ki,\n            kd,\n            axes,\n        );\n        this.pidControllers.add(controller);\n        return controller;\n    }\n\n    /**\n     * Removes a PID controller from this world.\n     *\n     * @param controller - The PID controller to remove.\n     */\n    public removePidController(controller: PidController) {\n        this.pidControllers.delete(controller);\n        controller.free();\n    }\n\n    // #if DIM3\n    /**\n     * Creates a new vehicle controller.\n     *\n     * @param chassis - The rigid-body used as the chassis of the vehicle controller. When the vehicle\n     *                  controller is updated, it will change directly the rigid-body’s velocity. This\n     *                  rigid-body must be a dynamic or kinematic-velocity-based rigid-body.\n     */\n    public createVehicleController(\n        chassis: RigidBody,\n    ): DynamicRayCastVehicleController {\n        let controller = new DynamicRayCastVehicleController(\n            chassis,\n            this.broadPhase,\n            this.narrowPhase,\n            this.bodies,\n            this.colliders,\n        );\n        this.vehicleControllers.add(controller);\n        return controller;\n    }\n\n    /**\n     * Removes a vehicle controller from this world.\n     *\n     * @param controller - The vehicle controller to remove.\n     */\n    public removeVehicleController(\n        controller: DynamicRayCastVehicleController,\n    ) {\n        this.vehicleControllers.delete(controller);\n        controller.free();\n    }\n\n    // #endif\n\n    /**\n     * Creates a new collider.\n     *\n     * @param desc - The description of the collider.\n     * @param parent - The rigid-body this collider is attached to.\n     */\n    public createCollider(desc: ColliderDesc, parent?: RigidBody): Collider {\n        let parentHandle = parent ? parent.handle : undefined;\n        return this.colliders.createCollider(this.bodies, desc, parentHandle);\n    }\n\n    /**\n     * Creates a new soft body from the given description, with its hidden root rigid body\n     * and the colliders of its collision meshes.\n     *\n     * @param desc - The description of the soft body to create.\n     */\n    public createSoftBody(desc: SoftBodyDesc): SoftBody {\n        return this.softBodies.createSoftBody(\n            this.bodies,\n            this.colliders,\n            desc,\n        );\n    }\n\n    /**\n     * Creates a collider holding a soft body's deformable collision mesh (a polyline in 2D or\n     * a triangle mesh in 3D built with the `DEFORMABLE` flag), bound to the cluster whose\n     * proxy is `parent` (see `SoftBody.rootBody` and `SoftBody.clusterProxy`).\n     *\n     * Returns `null` when the binding fails.\n     *\n     * @param desc - The description of the collider; its shape's vertices are given in the\n     *               collider's local frame relative to the proxy.\n     * @param binding - How the mesh's vertices follow the cluster's particles.\n     * @param parent - The cluster proxy the collider is attached to.\n     */\n    public createDeformableCollider(\n        desc: ColliderDesc,\n        binding: SoftMeshBinding,\n        parent: RigidBody,\n    ): Collider | null {\n        return this.colliders.createDeformableCollider(\n            this.bodies,\n            this.softBodies,\n            desc,\n            binding,\n            parent.handle,\n        );\n    }\n\n    /**\n     * Adds a cluster to a soft body: a rigid proxy over the given particles that joints and\n     * colliders can attach to. Returns the cluster's index, or `null` if no particle was\n     * valid.\n     */\n    public addSoftBodyCluster(\n        body: SoftBody,\n        particles: Uint32Array | number[],\n    ): number | null {\n        return this.softBodies.addCluster(\n            body.handle,\n            particles,\n            this.bodies,\n            this.colliders,\n        );\n    }\n\n    /**\n     * Removes a cluster of a soft body, with its proxy, colliders and joints.\n     */\n    public removeSoftBodyCluster(body: SoftBody, cluster: number): boolean {\n        return this.softBodies.removeCluster(\n            body.handle,\n            cluster,\n            this.islands,\n            this.bodies,\n            this.colliders,\n            this.impulseJoints,\n            this.multibodyJoints,\n        );\n    }\n\n    /**\n     * Tears a soft body at once along the given edges and through the given cells (indices\n     * into `SoftBody.edges` and `SoftBody.cells`), without removing material. Pieces\n     * disconnected by the tear become soft bodies of their own.\n     *\n     * Returns the tear event (to be freed with `.free()`), or `null` when nothing changed.\n     */\n    public tearSoftBody(\n        body: SoftBody,\n        edges: Uint32Array | number[],\n        cells: Uint32Array | number[],\n    ): SoftBodyTearEvent | null {\n        return this.softBodies.tear(\n            body.handle,\n            edges,\n            cells,\n            this.islands,\n            this.bodies,\n            this.colliders,\n            this.impulseJoints,\n            this.multibodyJoints,\n        );\n    }\n\n    /**\n     * Cuts a soft body along a blade: a segment (two points) in 2D, a triangle (three points)\n     * in 3D. Pieces disconnected by the cut become soft bodies of their own.\n     *\n     * Returns the tear event (to be freed with `.free()`), or `null` when nothing changed.\n     */\n    public cutSoftBody(\n        body: SoftBody,\n        blade: Vector[],\n    ): SoftBodyTearEvent | null {\n        return this.softBodies.cut(\n            body.handle,\n            blade,\n            this.islands,\n            this.bodies,\n            this.colliders,\n            this.impulseJoints,\n            this.multibodyJoints,\n        );\n    }\n\n    /**\n     * Wakes a soft body and everything it touches up.\n     */\n    public wakeUpSoftBody(body: SoftBody, strong: boolean) {\n        this.softBodies.wakeUp(body.handle, this.bodies, strong);\n    }\n\n    /**\n     * Creates a new impulse joint from the given joint descriptor.\n     *\n     * @param params - The description of the joint to create.\n     * @param parent1 - The first rigid-body attached to this joint.\n     * @param parent2 - The second rigid-body attached to this joint.\n     * @param wakeUp - Should the attached rigid-bodies be awakened?\n     */\n    public createImpulseJoint(\n        params: JointData,\n        parent1: RigidBody,\n        parent2: RigidBody,\n        wakeUp: boolean,\n    ): ImpulseJoint {\n        return this.impulseJoints.createJoint(\n            this.bodies,\n            params,\n            parent1.handle,\n            parent2.handle,\n            wakeUp,\n        );\n    }\n\n    /**\n     * Creates a new multibody joint from the given joint descriptor.\n     *\n     * @param params - The description of the joint to create.\n     * @param parent1 - The first rigid-body attached to this joint.\n     * @param parent2 - The second rigid-body attached to this joint.\n     * @param wakeUp - Should the attached rigid-bodies be awakened?\n     */\n    public createMultibodyJoint(\n        params: JointData,\n        parent1: RigidBody,\n        parent2: RigidBody,\n        wakeUp: boolean,\n    ): MultibodyJoint {\n        return this.multibodyJoints.createJoint(\n            params,\n            parent1.handle,\n            parent2.handle,\n            wakeUp,\n        );\n    }\n\n    /**\n     * Retrieves a rigid-body from its handle.\n     *\n     * @param handle - The integer handle of the rigid-body to retrieve.\n     */\n    public getRigidBody(handle: RigidBodyHandle): RigidBody {\n        return this.bodies.get(handle);\n    }\n\n    /**\n     * Retrieves a collider from its handle.\n     *\n     * @param handle - The integer handle of the collider to retrieve.\n     */\n    public getCollider(handle: ColliderHandle): Collider {\n        return this.colliders.get(handle);\n    }\n\n    /**\n     * Retrieves an impulse joint from its handle.\n     *\n     * @param handle - The integer handle of the impulse joint to retrieve.\n     */\n    public getImpulseJoint(handle: ImpulseJointHandle): ImpulseJoint {\n        return this.impulseJoints.get(handle);\n    }\n\n    /**\n     * Retrieves an multibody joint from its handle.\n     *\n     * @param handle - The integer handle of the multibody joint to retrieve.\n     */\n    public getMultibodyJoint(handle: MultibodyJointHandle): MultibodyJoint {\n        return this.multibodyJoints.get(handle);\n    }\n\n    /**\n     * Retrieves a soft body from its handle.\n     *\n     * @param handle - The integer handle of the soft body to retrieve.\n     */\n    public getSoftBody(handle: SoftBodyHandle): SoftBody {\n        return this.softBodies.get(handle);\n    }\n\n    /**\n     * Removes the given rigid-body from this physics world.\n     *\n     * This will remove this rigid-body as well as all its attached colliders and joints.\n     * Every other bodies touching or attached by joints to this rigid-body will be woken-up.\n     *\n     * @param body - The rigid-body to remove.\n     */\n    public removeRigidBody(body: RigidBody) {\n        if (this.bodies) {\n            this.bodies.remove(\n                body.handle,\n                this.islands,\n                this.colliders,\n                this.softBodies,\n                this.impulseJoints,\n                this.multibodyJoints,\n            );\n        }\n    }\n\n    /**\n     * Removes the given soft body from this physics world, with its proxies, colliders and\n     * attached joints.\n     *\n     * @param body - The soft body to remove.\n     */\n    public removeSoftBody(body: SoftBody) {\n        if (this.softBodies) {\n            this.softBodies.remove(\n                body.handle,\n                this.islands,\n                this.bodies,\n                this.colliders,\n                this.impulseJoints,\n                this.multibodyJoints,\n            );\n        }\n    }\n\n    /**\n     * Removes the given collider from this physics world.\n     *\n     * @param collider - The collider to remove.\n     * @param wakeUp - If set to `true`, the rigid-body this collider is attached to will be awaken.\n     */\n    public removeCollider(collider: Collider, wakeUp: boolean) {\n        if (this.colliders) {\n            this.colliders.remove(\n                collider.handle,\n                this.islands,\n                this.bodies,\n                this.softBodies,\n                wakeUp,\n            );\n        }\n    }\n\n    /**\n     * Removes the given impulse joint from this physics world.\n     *\n     * @param joint - The impulse joint to remove.\n     * @param wakeUp - If set to `true`, the rigid-bodies attached by this joint will be awaken.\n     */\n    public removeImpulseJoint(joint: ImpulseJoint, wakeUp: boolean) {\n        if (this.impulseJoints) {\n            this.impulseJoints.remove(joint.handle, wakeUp);\n        }\n    }\n\n    /**\n     * Removes the given multibody joint from this physics world.\n     *\n     * @param joint - The multibody joint to remove.\n     * @param wakeUp - If set to `true`, the rigid-bodies attached by this joint will be awaken.\n     */\n    public removeMultibodyJoint(joint: MultibodyJoint, wakeUp: boolean) {\n        if (this.impulseJoints) {\n            this.multibodyJoints.remove(joint.handle, wakeUp);\n        }\n    }\n\n    /**\n     * Applies the given closure to each collider managed by this physics world.\n     *\n     * @param f(collider) - The function to apply to each collider managed by this physics world. Called as `f(collider)`.\n     */\n    public forEachCollider(f: (collider: Collider) => void) {\n        this.colliders.forEach(f);\n    }\n\n    /**\n     * Applies the given closure to each rigid-body managed by this physics world.\n     *\n     * @param f(body) - The function to apply to each rigid-body managed by this physics world. Called as `f(collider)`.\n     */\n    public forEachRigidBody(f: (body: RigidBody) => void) {\n        this.bodies.forEach(f);\n    }\n\n    /**\n     * Applies the given closure to each active rigid-body managed by this physics world.\n     *\n     * After a short time of inactivity, a rigid-body is automatically deactivated (\"asleep\") by\n     * the physics engine in order to save computational power. A sleeping rigid-body never moves\n     * unless it is moved manually by the user.\n     *\n     * @param f - The function to apply to each active rigid-body managed by this physics world. Called as `f(collider)`.\n     */\n    public forEachActiveRigidBody(f: (body: RigidBody) => void) {\n        this.bodies.forEachActiveRigidBody(this.islands, f);\n    }\n\n    /**\n     * Applies the given closure to each soft body managed by this physics world.\n     *\n     * @param f(body) - The function to apply to each soft body managed by this physics world.\n     */\n    public forEachSoftBody(f: (body: SoftBody) => void) {\n        this.softBodies.forEach(f);\n    }\n\n    /**\n     * Find the closest intersection between a ray and the physics world.\n     *\n     * @param ray - The ray to cast.\n     * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively\n     *   limits the length of the ray to `ray.dir.norm() * maxToi`.\n     * @param solid - If `false` then the ray will attempt to hit the boundary of a shape, even if its\n     *   origin already lies inside of a shape. In other terms, `true` implies that all shapes are plain,\n     *   whereas `false` implies that all shapes are hollow for this ray-cast.\n     * @param groups - Used to filter the colliders that can or cannot be hit by the ray.\n     * @param filter - The callback to filter out which collider will be hit.\n     */\n    public castRay(\n        ray: Ray,\n        maxToi: number,\n        solid: boolean,\n        filterFlags?: QueryFilterFlags,\n        filterGroups?: InteractionGroups,\n        filterExcludeCollider?: Collider,\n        filterExcludeRigidBody?: RigidBody,\n        filterPredicate?: (collider: Collider) => boolean,\n    ): RayColliderHit | null {\n        return this.broadPhase.castRay(\n            this.narrowPhase,\n            this.bodies,\n            this.colliders,\n            ray,\n            maxToi,\n            solid,\n            filterFlags,\n            filterGroups,\n            filterExcludeCollider ? filterExcludeCollider.handle : null,\n            filterExcludeRigidBody ? filterExcludeRigidBody.handle : null,\n            this.colliders.castClosure(filterPredicate),\n        );\n    }\n\n    /**\n     * Find the closest intersection between a ray and the physics world.\n     *\n     * This also computes the normal at the hit point.\n     * @param ray - The ray to cast.\n     * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively\n     *   limits the length of the ray to `ray.dir.norm() * maxToi`.\n     * @param solid - If `false` then the ray will attempt to hit the boundary of a shape, even if its\n     *   origin already lies inside of a shape. In other terms, `true` implies that all shapes are plain,\n     *   whereas `false` implies that all shapes are hollow for this ray-cast.\n     * @param groups - Used to filter the colliders that can or cannot be hit by the ray.\n     */\n    public castRayAndGetNormal(\n        ray: Ray,\n        maxToi: number,\n        solid: boolean,\n        filterFlags?: QueryFilterFlags,\n        filterGroups?: InteractionGroups,\n        filterExcludeCollider?: Collider,\n        filterExcludeRigidBody?: RigidBody,\n        filterPredicate?: (collider: Collider) => boolean,\n    ): RayColliderIntersection | null {\n        return this.broadPhase.castRayAndGetNormal(\n            this.narrowPhase,\n            this.bodies,\n            this.colliders,\n            ray,\n            maxToi,\n            solid,\n            filterFlags,\n            filterGroups,\n            filterExcludeCollider ? filterExcludeCollider.handle : null,\n            filterExcludeRigidBody ? filterExcludeRigidBody.handle : null,\n            this.colliders.castClosure(filterPredicate),\n        );\n    }\n\n    /**\n     * Cast a ray and collects all the intersections between a ray and the scene.\n     *\n     * @param ray - The ray to cast.\n     * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively\n     *   limits the length of the ray to `ray.dir.norm() * maxToi`.\n     * @param solid - If `false` then the ray will attempt to hit the boundary of a shape, even if its\n     *   origin already lies inside of a shape. In other terms, `true` implies that all shapes are plain,\n     *   whereas `false` implies that all shapes are hollow for this ray-cast.\n     * @param groups - Used to filter the colliders that can or cannot be hit by the ray.\n     * @param callback - The callback called once per hit (in no particular order) between a ray and a collider.\n     *   If this callback returns `false`, then the cast will stop and no further hits will be detected/reported.\n     */\n    public intersectionsWithRay(\n        ray: Ray,\n        maxToi: number,\n        solid: boolean,\n        callback: (intersect: RayColliderIntersection) => boolean,\n        filterFlags?: QueryFilterFlags,\n        filterGroups?: InteractionGroups,\n        filterExcludeCollider?: Collider,\n        filterExcludeRigidBody?: RigidBody,\n        filterPredicate?: (collider: Collider) => boolean,\n    ) {\n        this.broadPhase.intersectionsWithRay(\n            this.narrowPhase,\n            this.bodies,\n            this.colliders,\n            ray,\n            maxToi,\n            solid,\n            callback,\n            filterFlags,\n            filterGroups,\n            filterExcludeCollider ? filterExcludeCollider.handle : null,\n            filterExcludeRigidBody ? filterExcludeRigidBody.handle : null,\n            this.colliders.castClosure(filterPredicate),\n        );\n    }\n\n    /**\n     * Gets the handle of up to one collider intersecting the given shape.\n     *\n     * @param shapePos - The position of the shape used for the intersection test.\n     * @param shapeRot - The orientation of the shape used for the intersection test.\n     * @param shape - The shape used for the intersection test.\n     * @param groups - The bit groups and filter associated to the ray, in order to only\n     *   hit the colliders with collision groups compatible with the ray's group.\n     */\n    public intersectionWithShape(\n        shapePos: Vector,\n        shapeRot: Rotation,\n        shape: Shape,\n        filterFlags?: QueryFilterFlags,\n        filterGroups?: InteractionGroups,\n        filterExcludeCollider?: Collider,\n        filterExcludeRigidBody?: RigidBody,\n        filterPredicate?: (collider: Collider) => boolean,\n    ): Collider | null {\n        let handle = this.broadPhase.intersectionWithShape(\n            this.narrowPhase,\n            this.bodies,\n            this.colliders,\n            shapePos,\n            shapeRot,\n            shape,\n            filterFlags,\n            filterGroups,\n            filterExcludeCollider ? filterExcludeCollider.handle : null,\n            filterExcludeRigidBody ? filterExcludeRigidBody.handle : null,\n            this.colliders.castClosure(filterPredicate),\n        );\n        return handle != null ? this.colliders.get(handle) : null;\n    }\n\n    /**\n     * Find the projection of a point on the closest collider.\n     *\n     * @param point - The point to project.\n     * @param solid - If this is set to `true` then the collider shapes are considered to\n     *   be plain (if the point is located inside of a plain shape, its projection is the point\n     *   itself). If it is set to `false` the collider shapes are considered to be hollow\n     *   (if the point is located inside of an hollow shape, it is projected on the shape's\n     *   boundary).\n     * @param groups - The bit groups and filter associated to the point to project, in order to only\n     *   project on colliders with collision groups compatible with the ray's group.\n     */\n    public projectPoint(\n        point: Vector,\n        solid: boolean,\n        filterFlags?: QueryFilterFlags,\n        filterGroups?: InteractionGroups,\n        filterExcludeCollider?: Collider,\n        filterExcludeRigidBody?: RigidBody,\n        filterPredicate?: (collider: Collider) => boolean,\n    ): PointColliderProjection | null {\n        return this.broadPhase.projectPoint(\n            this.narrowPhase,\n            this.bodies,\n            this.colliders,\n            point,\n            solid,\n            filterFlags,\n            filterGroups,\n            filterExcludeCollider ? filterExcludeCollider.handle : null,\n            filterExcludeRigidBody ? filterExcludeRigidBody.handle : null,\n            this.colliders.castClosure(filterPredicate),\n        );\n    }\n\n    /**\n     * Find the projection of a point on the closest collider.\n     *\n     * @param point - The point to project.\n     * @param groups - The bit groups and filter associated to the point to project, in order to only\n     *   project on colliders with collision groups compatible with the ray's group.\n     */\n    public projectPointAndGetFeature(\n        point: Vector,\n        filterFlags?: QueryFilterFlags,\n        filterGroups?: InteractionGroups,\n        filterExcludeCollider?: Collider,\n        filterExcludeRigidBody?: RigidBody,\n        filterPredicate?: (collider: Collider) => boolean,\n    ): PointColliderProjection | null {\n        return this.broadPhase.projectPointAndGetFeature(\n            this.narrowPhase,\n            this.bodies,\n            this.colliders,\n            point,\n            filterFlags,\n            filterGroups,\n            filterExcludeCollider ? filterExcludeCollider.handle : null,\n            filterExcludeRigidBody ? filterExcludeRigidBody.handle : null,\n            this.colliders.castClosure(filterPredicate),\n        );\n    }\n\n    /**\n     * Find all the colliders containing the given point.\n     *\n     * @param point - The point used for the containment test.\n     * @param groups - The bit groups and filter associated to the point to test, in order to only\n     *   test on colliders with collision groups compatible with the ray's group.\n     * @param callback - A function called with the handles of each collider with a shape\n     *   containing the `point`.\n     */\n    public intersectionsWithPoint(\n        point: Vector,\n        callback: (handle: Collider) => boolean,\n        filterFlags?: QueryFilterFlags,\n        filterGroups?: InteractionGroups,\n        filterExcludeCollider?: Collider,\n        filterExcludeRigidBody?: RigidBody,\n        filterPredicate?: (collider: Collider) => boolean,\n    ) {\n        this.broadPhase.intersectionsWithPoint(\n            this.narrowPhase,\n            this.bodies,\n            this.colliders,\n            point,\n            this.colliders.castClosure(callback),\n            filterFlags,\n            filterGroups,\n            filterExcludeCollider ? filterExcludeCollider.handle : null,\n            filterExcludeRigidBody ? filterExcludeRigidBody.handle : null,\n            this.colliders.castClosure(filterPredicate),\n        );\n    }\n\n    /**\n     * Casts a shape at a constant linear velocity and retrieve the first collider it hits.\n     * This is similar to ray-casting except that we are casting a whole shape instead of\n     * just a point (the ray origin).\n     *\n     * In the returned hit, `witness1` and `normal1` lie on the hit collider and are expressed in\n     * world-space, while `witness2` and `normal2` lie on the cast shape and are expressed in its\n     * local-space (relative to `shapePos` and `shapeRot`).\n     *\n     * @param shapePos - The initial position of the shape to cast.\n     * @param shapeRot - The initial rotation of the shape to cast.\n     * @param shapeVel - The constant velocity of the shape to cast (i.e. the cast direction).\n     * @param shape - The shape to cast.\n     * @param targetDistance − If the shape moves closer to this distance from a collider, a hit\n     *                         will be returned.\n     * @param maxToi - The maximum time-of-impact that can be reported by this cast. This effectively\n     *   limits the distance traveled by the shape to `shapeVel.norm() * maxToi`.\n     * @param stopAtPenetration - If set to `false`, the linear shape-cast won’t immediately stop if\n     *   the shape is penetrating another shape at its starting point **and** its trajectory is such\n     *   that it’s on a path to exit that penetration state.\n     * @param groups - The bit groups and filter associated to the shape to cast, in order to only\n     *   test on colliders with collision groups compatible with this group.\n     */\n    public castShape(\n        shapePos: Vector,\n        shapeRot: Rotation,\n        shapeVel: Vector,\n        shape: Shape,\n        targetDistance: number,\n        maxToi: number,\n        stopAtPenetration: boolean,\n        filterFlags?: QueryFilterFlags,\n        filterGroups?: InteractionGroups,\n        filterExcludeCollider?: Collider,\n        filterExcludeRigidBody?: RigidBody,\n        filterPredicate?: (collider: Collider) => boolean,\n    ): ColliderShapeCastHit | null {\n        return this.broadPhase.castShape(\n            this.narrowPhase,\n            this.bodies,\n            this.colliders,\n            shapePos,\n            shapeRot,\n            shapeVel,\n            shape,\n            targetDistance,\n            maxToi,\n            stopAtPenetration,\n            filterFlags,\n            filterGroups,\n            filterExcludeCollider ? filterExcludeCollider.handle : null,\n            filterExcludeRigidBody ? filterExcludeRigidBody.handle : null,\n            this.colliders.castClosure(filterPredicate),\n        );\n    }\n\n    /**\n     * Retrieve all the colliders intersecting the given shape.\n     *\n     * @param shapePos - The position of the shape to test.\n     * @param shapeRot - The orientation of the shape to test.\n     * @param shape - The shape to test.\n     * @param groups - The bit groups and filter associated to the shape to test, in order to only\n     *   test on colliders with collision groups compatible with this group.\n     * @param callback - A function called with the handles of each collider intersecting the `shape`.\n     */\n    public intersectionsWithShape(\n        shapePos: Vector,\n        shapeRot: Rotation,\n        shape: Shape,\n        callback: (collider: Collider) => boolean,\n        filterFlags?: QueryFilterFlags,\n        filterGroups?: InteractionGroups,\n        filterExcludeCollider?: Collider,\n        filterExcludeRigidBody?: RigidBody,\n        filterPredicate?: (collider: Collider) => boolean,\n    ) {\n        this.broadPhase.intersectionsWithShape(\n            this.narrowPhase,\n            this.bodies,\n            this.colliders,\n            shapePos,\n            shapeRot,\n            shape,\n            this.colliders.castClosure(callback),\n            filterFlags,\n            filterGroups,\n            filterExcludeCollider ? filterExcludeCollider.handle : null,\n            filterExcludeRigidBody ? filterExcludeRigidBody.handle : null,\n            this.colliders.castClosure(filterPredicate),\n        );\n    }\n\n    /**\n     * Finds the handles of all the colliders with an AABB intersecting the given AABB.\n     *\n     * @param aabbCenter - The center of the AABB to test.\n     * @param aabbHalfExtents - The half-extents of the AABB to test.\n     * @param callback - The callback that will be called with the handles of all the colliders\n     *                   currently intersecting the given AABB.\n     */\n    public collidersWithAabbIntersectingAabb(\n        aabbCenter: Vector,\n        aabbHalfExtents: Vector,\n        callback: (handle: Collider) => boolean,\n    ) {\n        this.broadPhase.collidersWithAabbIntersectingAabb(\n            this.narrowPhase,\n            this.bodies,\n            this.colliders,\n            aabbCenter,\n            aabbHalfExtents,\n            this.colliders.castClosure(callback),\n        );\n    }\n\n    /**\n     * Enumerates all the colliders potentially in contact with the given collider.\n     *\n     * @param collider1 - The second collider involved in the contact.\n     * @param f - Closure that will be called on each collider that is in contact with `collider1`.\n     */\n    public contactPairsWith(\n        collider1: Collider,\n        f: (collider2: Collider) => void,\n    ) {\n        this.narrowPhase.contactPairsWith(\n            collider1.handle,\n            this.colliders.castClosure(f),\n        );\n    }\n\n    /**\n     * Enumerates all the colliders intersecting the given colliders, assuming one of them\n     * is a sensor.\n     */\n    public intersectionPairsWith(\n        collider1: Collider,\n        f: (collider2: Collider) => void,\n    ) {\n        this.narrowPhase.intersectionPairsWith(\n            collider1.handle,\n            this.colliders.castClosure(f),\n        );\n    }\n\n    /**\n     * Iterates through all the contact manifolds between the given pair of colliders.\n     *\n     * @param collider1 - The first collider involved in the contact.\n     * @param collider2 - The second collider involved in the contact.\n     * @param f - Closure that will be called on each contact manifold between the two colliders. If the second argument\n     *            passed to this closure is `true`, then the contact manifold data is flipped, i.e., methods like `localNormal1`\n     *            actually apply to the `collider2` and fields like `localNormal2` apply to the `collider1`.\n     */\n    public contactPair(\n        collider1: Collider,\n        collider2: Collider,\n        f: (manifold: TempContactManifold, flipped: boolean) => void,\n    ) {\n        this.narrowPhase.contactPair(\n            collider1.handle,\n            collider2.handle,\n            this.bodies,\n            f,\n        );\n    }\n\n    /**\n     * Returns `true` if `collider1` and `collider2` intersect and at least one of them is a sensor.\n     * @param collider1 − The first collider involved in the intersection.\n     * @param collider2 − The second collider involved in the intersection.\n     */\n    public intersectionPair(collider1: Collider, collider2: Collider): boolean {\n        return this.narrowPhase.intersectionPair(\n            collider1.handle,\n            collider2.handle,\n        );\n    }\n\n    /**\n     * Sets whether internal performance profiling is enabled (default: false).\n     *\n     * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.\n     */\n    set profilerEnabled(enabled: boolean) {\n        this.physicsPipeline.raw.set_profiler_enabled(enabled);\n    }\n\n    /**\n     * Indicates if the internal performance profiling is enabled.\n     *\n     * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.\n     */\n    get profilerEnabled(): boolean {\n        return this.physicsPipeline.raw.is_profiler_enabled();\n    }\n\n    /**\n     * The time spent in milliseconds by the last step to run the entire simulation step.\n     *\n     * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.\n     */\n    public timingStep(): number {\n        return this.physicsPipeline.raw.timing_step();\n    }\n\n    /**\n     * The time spent in milliseconds by the last step to run the collision-detection\n     * (broad-phase + narrow-phase).\n     *\n     * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.\n     */\n    public timingCollisionDetection(): number {\n        return this.physicsPipeline.raw.timing_collision_detection();\n    }\n\n    /**\n     * The time spent in milliseconds by the last step to run the broad-phase.\n     *\n     * This timing is included in `timingCollisionDetection`.\n     * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.\n     */\n    public timingBroadPhase(): number {\n        return this.physicsPipeline.raw.timing_broad_phase();\n    }\n\n    /**\n     * The time spent in milliseconds by the last step to run the narrow-phase.\n     *\n     * This timing is included in `timingCollisionDetection`.\n     * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.\n     */\n    public timingNarrowPhase(): number {\n        return this.physicsPipeline.raw.timing_narrow_phase();\n    }\n\n    /**\n     * The time spent in milliseconds by the last step to run the constraint solver.\n     *\n     * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.\n     */\n    public timingSolver(): number {\n        return this.physicsPipeline.raw.timing_solver();\n    }\n\n    /**\n     * The time spent in milliseconds by the last step to run the constraint\n     * initialization.\n     *\n     * This timing is included in `timingSolver`.\n     * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.\n     */\n    public timingVelocityAssembly(): number {\n        return this.physicsPipeline.raw.timing_velocity_assembly();\n    }\n\n    /**\n     * The time spent in milliseconds by the last step to run the constraint\n     * resolution.\n     *\n     * This timing is included in `timingSolver`.\n     * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.\n     */\n    public timingVelocityResolution(): number {\n        return this.physicsPipeline.raw.timing_velocity_resolution();\n    }\n\n    /**\n     * The time spent in milliseconds by the last step to run the rigid-body\n     * velocity update.\n     *\n     * This timing is included in `timingSolver`.\n     * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.\n     */\n    public timingVelocityUpdate(): number {\n        return this.physicsPipeline.raw.timing_velocity_update();\n    }\n\n    /**\n     * The time spent in milliseconds by writing rigid-body velocities\n     * calculated by the solver back into the rigid-bodies.\n     *\n     * This timing is included in `timingSolver`.\n     * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.\n     */\n    public timingVelocityWriteback(): number {\n        return this.physicsPipeline.raw.timing_velocity_writeback();\n    }\n\n    /**\n     * The total time spent in CCD detection and resolution.\n     *\n     * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.\n     */\n    public timingCcd(): number {\n        return this.physicsPipeline.raw.timing_ccd();\n    }\n\n    /**\n     * The total time spent searching for the continuous hits during CCD.\n     *\n     * This timing is included in `timingCcd`.\n     * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.\n     */\n    public timingCcdToiComputation(): number {\n        return this.physicsPipeline.raw.timing_ccd_toi_computation();\n    }\n\n    /**\n     * The total time spent in the broad-phase during CCD.\n     *\n     * This timing is included in `timingCcd`.\n     * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.\n     */\n    public timingCcdBroadPhase(): number {\n        return this.physicsPipeline.raw.timing_ccd_broad_phase();\n    }\n\n    /**\n     * The total time spent in the narrow-phase during CCD.\n     *\n     * This timing is included in `timingCcd`.\n     * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.\n     */\n    public timingCcdNarrowPhase(): number {\n        return this.physicsPipeline.raw.timing_ccd_narrow_phase();\n    }\n\n    /**\n     * The total time spent in the constraints resolution during CCD.\n     *\n     * This timing is included in `timingCcd`.\n     * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.\n     */\n    public timingCcdSolver(): number {\n        return this.physicsPipeline.raw.timing_ccd_solver();\n    }\n\n    /**\n     * The total time spent in the islands calculation during CCD.\n     *\n     * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.\n     */\n    public timingIslandConstruction(): number {\n        return this.physicsPipeline.raw.timing_island_construction();\n    }\n\n    /**\n     * The total time spent propagating detected user changes.\n     *\n     * Only works if the internal profiler is enabled with `World.profilerEnabled = true`.\n     */\n    public timingUserChanges(): number {\n        return this.physicsPipeline.raw.timing_user_changes();\n    }\n}\n","import {RawColliderSet} from \"../raw\";\nimport {Coarena} from \"../coarena\";\nimport {RotationOps, VectorOps} from \"../math\";\nimport {Collider, ColliderDesc, ColliderHandle} from \"./collider\";\nimport {\n    ImpulseJointHandle,\n    IslandManager,\n    RigidBodyHandle,\n    RigidBodySet,\n    SoftBodySet,\n    SoftMeshBinding,\n} from \"../dynamics\";\n\n/**\n * A set of rigid bodies that can be handled by a physics pipeline.\n *\n * To avoid leaking WASM resources, this MUST be freed manually with `colliderSet.free()`\n * once you are done using it (and all the rigid-bodies it created).\n */\nexport class ColliderSet {\n    raw: RawColliderSet;\n    private map: Coarena<Collider>;\n\n    /**\n     * Release the WASM memory occupied by this collider set.\n     */\n    public free() {\n        if (!!this.raw) {\n            this.raw.free();\n        }\n        this.raw = undefined;\n\n        if (!!this.map) {\n            this.map.clear();\n        }\n        this.map = undefined;\n    }\n\n    constructor(raw?: RawColliderSet) {\n        this.raw = raw || new RawColliderSet();\n        this.map = new Coarena<Collider>();\n        // Initialize the map with the existing elements, if any.\n        if (raw) {\n            raw.forEachColliderHandle((handle: ColliderHandle) => {\n                this.map.set(handle, new Collider(this, handle, null));\n            });\n        }\n    }\n\n    /** @internal */\n    public castClosure<Res>(\n        f?: (collider: Collider) => Res,\n    ): (handle: ColliderHandle) => Res | undefined {\n        return (handle) => {\n            if (!!f) {\n                return f(this.get(handle));\n            } else {\n                return undefined;\n            }\n        };\n    }\n\n    /** @internal */\n    public finalizeDeserialization(bodies: RigidBodySet) {\n        this.map.forEach((collider) =>\n            collider.finalizeDeserialization(bodies),\n        );\n    }\n\n    /**\n     * Creates a new collider and return its integer handle.\n     *\n     * @param bodies - The set of bodies where the collider's parent can be found.\n     * @param desc - The collider's description.\n     * @param parentHandle - The integer handle of the rigid-body this collider is attached to.\n     */\n    public createCollider(\n        bodies: RigidBodySet,\n        desc: ColliderDesc,\n        parentHandle: RigidBodyHandle,\n    ): Collider {\n        let hasParent = parentHandle != undefined && parentHandle != null;\n\n        if (hasParent && isNaN(parentHandle))\n            throw Error(\n                \"Cannot create a collider with a parent rigid-body handle that is not a number.\",\n            );\n\n        let rawShape = desc.shape.intoRaw();\n        let rawTra = VectorOps.intoRaw(desc.translation);\n        let rawRot = RotationOps.intoRaw(desc.rotation);\n        let rawCom = VectorOps.intoRaw(desc.centerOfMass);\n\n        // #if DIM3\n        let rawPrincipalInertia = VectorOps.intoRaw(\n            desc.principalAngularInertia,\n        );\n        let rawInertiaFrame = RotationOps.intoRaw(\n            desc.angularInertiaLocalFrame,\n        );\n        // #endif\n\n        let handle = this.raw.createCollider(\n            desc.enabled,\n            rawShape,\n            rawTra,\n            rawRot,\n            desc.massPropsMode,\n            desc.mass,\n            rawCom,\n            // #if DIM3\n            rawPrincipalInertia,\n            rawInertiaFrame,\n            // #endif\n            desc.density,\n            desc.friction,\n            desc.restitution,\n            desc.frictionCombineRule,\n            desc.restitutionCombineRule,\n            desc.isSensor,\n            desc.collisionGroups,\n            desc.solverGroups,\n            desc.activeCollisionTypes,\n            desc.activeHooks,\n            desc.activeEvents,\n            desc.contactForceEventThreshold,\n            desc.contactSkin,\n            hasParent,\n            hasParent ? parentHandle : 0,\n            bodies.raw,\n        );\n\n        rawShape.free();\n        rawTra.free();\n        rawRot.free();\n        rawCom.free();\n\n        // #if DIM3\n        rawPrincipalInertia.free();\n        rawInertiaFrame.free();\n        // #endif\n\n        let parent = hasParent ? bodies.get(parentHandle) : null;\n        let collider = new Collider(this, handle, parent, desc.shape);\n        this.map.set(handle, collider);\n        return collider;\n    }\n\n    /**\n     * Creates a collider holding a soft body's deformable collision mesh: a polyline (2D) or a\n     * triangle mesh (3D) built with the `DEFORMABLE` flag, whose vertices follow the cluster\n     * of the parent proxy through `binding`.\n     *\n     * Returns `null` when the binding fails: the parent is not a live cluster proxy, the shape\n     * is not a deformable mesh, or a vertex could not be bound.\n     *\n     * @param bodies - The set of bodies where the parent proxy can be found.\n     * @param softBodies - The set of soft bodies owning the cluster.\n     * @param desc - The collider's description.\n     * @param binding - How the mesh follows the cluster.\n     * @param parentHandle - The handle of the cluster proxy (see `SoftBody.rootBody`,\n     *                       `SoftBody.clusterProxy`).\n     */\n    public createDeformableCollider(\n        bodies: RigidBodySet,\n        softBodies: SoftBodySet,\n        desc: ColliderDesc,\n        binding: SoftMeshBinding,\n        parentHandle: RigidBodyHandle,\n    ): Collider | null {\n        let rawShape = desc.shape.intoRaw();\n        let rawTra = VectorOps.intoRaw(desc.translation);\n        let rawRot = RotationOps.intoRaw(desc.rotation);\n        let rawCom = VectorOps.intoRaw(desc.centerOfMass);\n\n        // #if DIM3\n        let rawPrincipalInertia = VectorOps.intoRaw(\n            desc.principalAngularInertia,\n        );\n        let rawInertiaFrame = RotationOps.intoRaw(\n            desc.angularInertiaLocalFrame,\n        );\n        // #endif\n\n        let handle = this.raw.createDeformableCollider(\n            desc.enabled,\n            rawShape,\n            rawTra,\n            rawRot,\n            desc.massPropsMode,\n            desc.mass,\n            rawCom,\n            // #if DIM3\n            rawPrincipalInertia,\n            rawInertiaFrame,\n            // #endif\n            desc.density,\n            desc.friction,\n            desc.restitution,\n            desc.frictionCombineRule,\n            desc.restitutionCombineRule,\n            desc.isSensor,\n            desc.collisionGroups,\n            desc.solverGroups,\n            desc.activeCollisionTypes,\n            desc.activeHooks,\n            desc.activeEvents,\n            desc.contactForceEventThreshold,\n            desc.contactSkin,\n            binding.rawMode(),\n            binding.particles,\n            binding.eps,\n            binding.selfContacts,\n            parentHandle,\n            bodies.raw,\n            softBodies.raw,\n        );\n\n        rawShape.free();\n        rawTra.free();\n        rawRot.free();\n        rawCom.free();\n\n        // #if DIM3\n        rawPrincipalInertia.free();\n        rawInertiaFrame.free();\n        // #endif\n\n        if (handle === undefined) {\n            return null;\n        }\n\n        let parent = bodies.get(parentHandle);\n        let collider = new Collider(this, handle, parent, desc.shape);\n        this.map.set(handle, collider);\n        return collider;\n    }\n\n    /**\n     * Wraps the colliders the engine created on its own (the deformable collision meshes of\n     * soft bodies) that have no JavaScript wrapper yet.\n     */\n    public mapNewColliders(bodies: RigidBodySet) {\n        this.raw.forEachColliderHandle((handle: ColliderHandle) => {\n            if (!this.map.get(handle)) {\n                let parentHandle = this.raw.coParent(handle);\n                let parent =\n                    parentHandle === undefined\n                        ? null\n                        : bodies.get(parentHandle);\n                this.map.set(handle, new Collider(this, handle, parent));\n            }\n        });\n    }\n\n    /**\n     * Drops the wrappers of the colliders the engine removed on its own (the colliders of\n     * removed soft bodies and clusters).\n     */\n    public unmapRemovedColliders() {\n        for (let collider of this.map.getAll()) {\n            if (!this.raw.contains(collider.handle)) {\n                this.map.delete(collider.handle);\n            }\n        }\n    }\n\n    /**\n     * Remove a collider from this set.\n     *\n     * @param handle - The integer handle of the collider to remove.\n     * @param bodies - The set of rigid-body containing the rigid-body the collider is attached to.\n     * @param wakeUp - If `true`, the rigid-body the removed collider is attached to will be woken-up automatically.\n     */\n    public remove(\n        handle: ColliderHandle,\n        islands: IslandManager,\n        bodies: RigidBodySet,\n        softBodies: SoftBodySet,\n        wakeUp: boolean,\n    ) {\n        this.raw.remove(\n            handle,\n            islands.raw,\n            bodies.raw,\n            softBodies.raw,\n            wakeUp,\n        );\n        this.unmap(handle);\n    }\n\n    /**\n     * Internal function, do not call directly.\n     * @param handle\n     */\n    public unmap(handle: ImpulseJointHandle) {\n        this.map.delete(handle);\n    }\n\n    /**\n     * Gets the rigid-body with the given handle.\n     *\n     * @param handle - The handle of the rigid-body to retrieve.\n     */\n    public get(handle: ColliderHandle): Collider | null {\n        return this.map.get(handle);\n    }\n\n    /**\n     * The number of colliders on this set.\n     */\n    public len(): number {\n        return this.map.len();\n    }\n\n    /**\n     * Does this set contain a collider with the given handle?\n     *\n     * @param handle - The collider handle to check.\n     */\n    public contains(handle: ColliderHandle): boolean {\n        return this.get(handle) != null;\n    }\n\n    /**\n     * Applies the given closure to each collider contained by this set.\n     *\n     * @param f - The closure to apply.\n     */\n    public forEach(f: (collider: Collider) => void) {\n        this.map.forEach(f);\n    }\n\n    /**\n     * Gets all colliders in the list.\n     *\n     * @returns collider list.\n     */\n    public getAll(): Collider[] {\n        return this.map.getAll();\n    }\n}\n","import {RawIntegrationParameters} from \"../raw\";\nimport {SoftRecoverySettings} from \"./soft_body\";\n\nexport class IntegrationParameters {\n    raw: RawIntegrationParameters;\n\n    constructor(raw?: RawIntegrationParameters) {\n        this.raw = raw || new RawIntegrationParameters();\n    }\n\n    /**\n     * Free the WASM memory used by these integration parameters.\n     */\n    public free() {\n        if (!!this.raw) {\n            this.raw.free();\n        }\n        this.raw = undefined;\n    }\n\n    /**\n     * The timestep length (default: `1.0 / 60.0`)\n     */\n    get dt(): number {\n        return this.raw.dt;\n    }\n\n    /**\n     * The Error Reduction Parameter in `[0, 1]` is the proportion of\n     * the positional error to be corrected at each time step (default: `0.2`).\n     */\n    get contact_erp(): number {\n        return this.raw.contact_erp;\n    }\n\n    get lengthUnit(): number {\n        return this.raw.lengthUnit;\n    }\n\n    /**\n     * Normalized amount of penetration the engine won’t attempt to correct (default: `0.001m`).\n     *\n     * This threshold considered by the physics engine is this value multiplied by the `lengthUnit`.\n     */\n    get normalizedAllowedLinearError(): number {\n        return this.raw.normalizedAllowedLinearError;\n    }\n\n    /**\n     * The maximal normalized distance separating two objects that will generate predictive contacts (default: `0.02`).\n     *\n     * This threshold considered by the physics engine is this value multiplied by the `lengthUnit`.\n     */\n    get normalizedPredictionDistance(): number {\n        return this.raw.normalizedPredictionDistance;\n    }\n\n    /**\n     * The number of solver iterations run by the constraints solver for calculating forces (default: `4`).\n     */\n    get numSolverIterations(): number {\n        return this.raw.numSolverIterations;\n    }\n\n    /**\n     * Number of internal Project Gauss Seidel (PGS) iterations run at each solver iteration (default: `1`).\n     */\n    get numInternalPgsIterations(): number {\n        return this.raw.numInternalPgsIterations;\n    }\n\n    /**\n     * Maximum number of substeps performed by the  solver (default: `1`).\n     */\n    get maxCcdSubsteps(): number {\n        return this.raw.maxCcdSubsteps;\n    }\n\n    /**\n     * Strain beyond which a soft-body constraint is re-solved after the contacts inside every\n     * substep, so a light body buried under heavier ones is not torn (default: `0.75`).\n     */\n    get softBodiesResweepStrain(): number {\n        return this.raw.softBodiesResweepStrain;\n    }\n\n    /**\n     * Maximum number of extra substeps a soft body requests for its island while it is hit\n     * fast (default: `4`; `0` disables the impact-adaptive substeps).\n     */\n    get softBodiesMaxExtraSubsteps(): number {\n        return this.raw.softBodiesMaxExtraSubsteps;\n    }\n\n    /**\n     * Factor applied to the contact softness natural frequencies for the soft-body contacts\n     * (default: `4.0`).\n     */\n    get softBodiesContactStiffening(): number {\n        return this.raw.softBodiesContactStiffening;\n    }\n\n    /**\n     * The tangle detection and recovery settings shared by every soft body of the world.\n     *\n     * This gives back a copy: change it and assign it back to apply it.\n     */\n    get softBodiesRecovery(): SoftRecoverySettings {\n        return SoftRecoverySettings.fromRaw(this.raw.softBodiesRecovery);\n    }\n\n    /**\n     * Relative residual at which the conjugate gradient of the FEM soft-body solver stops\n     * (default: `1.0e-5`).\n     */\n    get softBodiesFemLinearTolerance(): number {\n        return this.raw.softBodiesFemLinearTolerance;\n    }\n\n    /**\n     * Hard cap on the conjugate-gradient iterations of the FEM soft-body solver, whatever the\n     * residual (default: `20`).\n     */\n    get softBodiesFemMaxLinearIterations(): number {\n        return this.raw.softBodiesFemMaxLinearIterations;\n    }\n\n    /**\n     * Largest number of degrees of freedom for which a FEM soft body is factorized directly\n     * (default: `600`); the larger ones rely on the conjugate gradient.\n     */\n    get softBodiesFemMaxDenseDofs(): number {\n        return this.raw.softBodiesFemMaxDenseDofs;\n    }\n\n    set dt(value: number) {\n        this.raw.dt = value;\n    }\n\n    set softBodiesResweepStrain(value: number) {\n        this.raw.softBodiesResweepStrain = value;\n    }\n\n    set softBodiesMaxExtraSubsteps(value: number) {\n        this.raw.softBodiesMaxExtraSubsteps = value;\n    }\n\n    set softBodiesContactStiffening(value: number) {\n        this.raw.softBodiesContactStiffening = value;\n    }\n\n    set softBodiesRecovery(value: SoftRecoverySettings) {\n        let raw = value.intoRaw();\n        this.raw.softBodiesRecovery = raw;\n        raw.free();\n    }\n\n    set softBodiesFemLinearTolerance(value: number) {\n        this.raw.softBodiesFemLinearTolerance = value;\n    }\n\n    set softBodiesFemMaxLinearIterations(value: number) {\n        this.raw.softBodiesFemMaxLinearIterations = value;\n    }\n\n    set softBodiesFemMaxDenseDofs(value: number) {\n        this.raw.softBodiesFemMaxDenseDofs = value;\n    }\n\n    set contact_natural_frequency(value: number) {\n        this.raw.contact_natural_frequency = value;\n    }\n\n    set lengthUnit(value: number) {\n        this.raw.lengthUnit = value;\n    }\n\n    set normalizedAllowedLinearError(value: number) {\n        this.raw.normalizedAllowedLinearError = value;\n    }\n\n    set normalizedPredictionDistance(value: number) {\n        this.raw.normalizedPredictionDistance = value;\n    }\n\n    /**\n     * Sets the number of solver iterations run by the constraints solver for calculating forces (default: `4`).\n     */\n    set numSolverIterations(value: number) {\n        this.raw.numSolverIterations = value;\n    }\n\n    /**\n     * Sets the number of internal Project Gauss Seidel (PGS) iterations run at each solver iteration (default: `1`).\n     */\n    set numInternalPgsIterations(value: number) {\n        this.raw.numInternalPgsIterations = value;\n    }\n\n    set maxCcdSubsteps(value: number) {\n        this.raw.maxCcdSubsteps = value;\n    }\n}\n","import {RawImpulseJointSet} from \"../raw\";\nimport {Coarena} from \"../coarena\";\nimport {RigidBodySet} from \"./rigid_body_set\";\nimport {\n    RevoluteImpulseJoint,\n    FixedImpulseJoint,\n    ImpulseJoint,\n    ImpulseJointHandle,\n    JointData,\n    JointType,\n    PrismaticImpulseJoint,\n    // #if DIM3\n    SphericalImpulseJoint,\n    // #endif\n} from \"./impulse_joint\";\nimport {IslandManager} from \"./island_manager\";\nimport {RigidBodyHandle} from \"./rigid_body\";\nimport {Collider, ColliderHandle} from \"../geometry\";\n\n/**\n * A set of joints.\n *\n * To avoid leaking WASM resources, this MUST be freed manually with `jointSet.free()`\n * once you are done using it (and all the joints it created).\n */\nexport class ImpulseJointSet {\n    raw: RawImpulseJointSet;\n    private map: Coarena<ImpulseJoint>;\n\n    /**\n     * Release the WASM memory occupied by this joint set.\n     */\n    public free() {\n        if (!!this.raw) {\n            this.raw.free();\n        }\n        this.raw = undefined;\n\n        if (!!this.map) {\n            this.map.clear();\n        }\n        this.map = undefined;\n    }\n\n    constructor(raw?: RawImpulseJointSet) {\n        this.raw = raw || new RawImpulseJointSet();\n        this.map = new Coarena<ImpulseJoint>();\n        // Initialize the map with the existing elements, if any.\n        if (raw) {\n            raw.forEachJointHandle((handle: ImpulseJointHandle) => {\n                this.map.set(handle, ImpulseJoint.newTyped(raw, null, handle));\n            });\n        }\n    }\n\n    /** @internal */\n    public finalizeDeserialization(bodies: RigidBodySet) {\n        this.map.forEach((joint) => joint.finalizeDeserialization(bodies));\n    }\n\n    /**\n     * Creates a new joint and return its integer handle.\n     *\n     * @param bodies - The set of rigid-bodies containing the bodies the joint is attached to.\n     * @param desc - The joint's parameters.\n     * @param parent1 - The handle of the first rigid-body this joint is attached to.\n     * @param parent2 - The handle of the second rigid-body this joint is attached to.\n     * @param wakeUp - Should the attached rigid-bodies be awakened?\n     */\n    public createJoint(\n        bodies: RigidBodySet,\n        desc: JointData,\n        parent1: RigidBodyHandle,\n        parent2: RigidBodyHandle,\n        wakeUp: boolean,\n    ): ImpulseJoint {\n        const rawParams = desc.intoRaw();\n        const handle = this.raw.createJoint(\n            rawParams,\n            parent1,\n            parent2,\n            wakeUp,\n        );\n        rawParams.free();\n        let joint = ImpulseJoint.newTyped(this.raw, bodies, handle);\n        this.map.set(handle, joint);\n        return joint;\n    }\n\n    /**\n     * Remove a joint from this set.\n     *\n     * @param handle - The integer handle of the joint.\n     * @param wakeUp - If `true`, the rigid-bodies attached by the removed joint will be woken-up automatically.\n     */\n    public remove(handle: ImpulseJointHandle, wakeUp: boolean) {\n        this.raw.remove(handle, wakeUp);\n        this.unmap(handle);\n    }\n\n    /**\n     * Calls the given closure with the integer handle of each impulse joint attached to this rigid-body.\n     *\n     * @param f - The closure called with the integer handle of each impulse joint attached to the rigid-body.\n     */\n    public forEachJointHandleAttachedToRigidBody(\n        handle: RigidBodyHandle,\n        f: (handle: ImpulseJointHandle) => void,\n    ) {\n        this.raw.forEachJointAttachedToRigidBody(handle, f);\n    }\n\n    /**\n     * Internal function, do not call directly.\n     * @param handle\n     */\n    public unmap(handle: ImpulseJointHandle) {\n        this.map.delete(handle);\n    }\n\n    /**\n     * Drops the wrappers of the joints the engine removed on its own (the joints of removed\n     * soft bodies and clusters).\n     */\n    public unmapRemovedJoints() {\n        for (let joint of this.map.getAll()) {\n            if (!this.raw.contains(joint.handle)) {\n                this.map.delete(joint.handle);\n            }\n        }\n    }\n\n    /**\n     * The number of joints on this set.\n     */\n    public len(): number {\n        return this.map.len();\n    }\n\n    /**\n     * Does this set contain a joint with the given handle?\n     *\n     * @param handle - The joint handle to check.\n     */\n    public contains(handle: ImpulseJointHandle): boolean {\n        return this.get(handle) != null;\n    }\n\n    /**\n     * Gets the joint with the given handle.\n     *\n     * Returns `null` if no joint with the specified handle exists.\n     *\n     * @param handle - The integer handle of the joint to retrieve.\n     */\n    public get(handle: ImpulseJointHandle): ImpulseJoint | null {\n        return this.map.get(handle);\n    }\n\n    /**\n     * Applies the given closure to each joint contained by this set.\n     *\n     * @param f - The closure to apply.\n     */\n    public forEach(f: (joint: ImpulseJoint) => void) {\n        this.map.forEach(f);\n    }\n\n    /**\n     * Gets all joints in the list.\n     *\n     * @returns joint list.\n     */\n    public getAll(): ImpulseJoint[] {\n        return this.map.getAll();\n    }\n}\n","import {\n    RawImpulseJointSet,\n    RawJointAxis,\n    RawJointType,\n    RawMultibodyJointSet,\n} from \"../raw\";\nimport {\n    FixedImpulseJoint,\n    ImpulseJointHandle,\n    JointType,\n    MotorModel,\n    PrismaticImpulseJoint,\n    RevoluteImpulseJoint,\n} from \"./impulse_joint\";\n\n// #if DIM3\nimport {Quaternion} from \"../math\";\nimport {SphericalImpulseJoint} from \"./impulse_joint\";\n// #endif\n\n/**\n * The integer identifier of a collider added to a `ColliderSet`.\n */\nexport type MultibodyJointHandle = number;\n\nexport class MultibodyJoint {\n    protected rawSet: RawMultibodyJointSet; // The MultibodyJoint won't need to free this.\n    handle: MultibodyJointHandle;\n\n    constructor(rawSet: RawMultibodyJointSet, handle: MultibodyJointHandle) {\n        this.rawSet = rawSet;\n        this.handle = handle;\n    }\n\n    public static newTyped(\n        rawSet: RawMultibodyJointSet,\n        handle: MultibodyJointHandle,\n    ): MultibodyJoint {\n        switch (rawSet.jointType(handle)) {\n            case RawJointType.Revolute:\n                return new RevoluteMultibodyJoint(rawSet, handle);\n            case RawJointType.Prismatic:\n                return new PrismaticMultibodyJoint(rawSet, handle);\n            case RawJointType.Fixed:\n                return new FixedMultibodyJoint(rawSet, handle);\n            // #if DIM3\n            case RawJointType.Spherical:\n                return new SphericalMultibodyJoint(rawSet, handle);\n            // #endif\n            default:\n                return new MultibodyJoint(rawSet, handle);\n        }\n    }\n\n    /**\n     * Checks if this joint is still valid (i.e. that it has\n     * not been deleted from the joint set yet).\n     */\n    public isValid(): boolean {\n        return this.rawSet.contains(this.handle);\n    }\n\n    // /**\n    //  * The unique integer identifier of the first rigid-body this joint it attached to.\n    //  */\n    // public bodyHandle1(): RigidBodyHandle {\n    //     return this.rawSet.jointBodyHandle1(this.handle);\n    // }\n    //\n    // /**\n    //  * The unique integer identifier of the second rigid-body this joint is attached to.\n    //  */\n    // public bodyHandle2(): RigidBodyHandle {\n    //     return this.rawSet.jointBodyHandle2(this.handle);\n    // }\n    //\n    // /**\n    //  * The type of this joint given as a string.\n    //  */\n    // public type(): JointType {\n    //     return this.rawSet.jointType(this.handle);\n    // }\n    //\n    // // #if DIM3\n    // /**\n    //  * The rotation quaternion that aligns this joint's first local axis to the `x` axis.\n    //  */\n    // public frameX1(): Rotation {\n    //     return RotationOps.fromRaw(this.rawSet.jointFrameX1(this.handle));\n    // }\n    //\n    // // #endif\n    //\n    // // #if DIM3\n    // /**\n    //  * The rotation matrix that aligns this joint's second local axis to the `x` axis.\n    //  */\n    // public frameX2(): Rotation {\n    //     return RotationOps.fromRaw(this.rawSet.jointFrameX2(this.handle));\n    // }\n    //\n    // // #endif\n    //\n    // /**\n    //  * The position of the first anchor of this joint.\n    //  *\n    //  * The first anchor gives the position of the points application point on the\n    //  * local frame of the first rigid-body it is attached to.\n    //  */\n    // public anchor1(): Vector {\n    //     return VectorOps.fromRaw(this.rawSet.jointAnchor1(this.handle));\n    // }\n    //\n    // /**\n    //  * The position of the second anchor of this joint.\n    //  *\n    //  * The second anchor gives the position of the points application point on the\n    //  * local frame of the second rigid-body it is attached to.\n    //  */\n    // public anchor2(): Vector {\n    //     return VectorOps.fromRaw(this.rawSet.jointAnchor2(this.handle));\n    // }\n\n    /**\n     * Controls whether contacts are computed between colliders attached\n     * to the rigid-bodies linked by this joint.\n     */\n    public setContactsEnabled(enabled: boolean) {\n        this.rawSet.jointSetContactsEnabled(this.handle, enabled);\n    }\n\n    /**\n     * Indicates if contacts are enabled between colliders attached\n     * to the rigid-bodies linked by this joint.\n     */\n    public contactsEnabled(): boolean {\n        return this.rawSet.jointContactsEnabled(this.handle);\n    }\n}\n\nexport class UnitMultibodyJoint extends MultibodyJoint {\n    /**\n     * The axis left free by this joint.\n     */\n    protected rawAxis?(): RawJointAxis;\n\n    // /**\n    //  * Are the limits enabled for this joint?\n    //  */\n    // public limitsEnabled(): boolean {\n    //     return this.rawSet.jointLimitsEnabled(this.handle, this.rawAxis());\n    // }\n    //\n    // /**\n    //  * The min limit of this joint.\n    //  */\n    // public limitsMin(): number {\n    //     return this.rawSet.jointLimitsMin(this.handle, this.rawAxis());\n    // }\n    //\n    // /**\n    //  * The max limit of this joint.\n    //  */\n    // public limitsMax(): number {\n    //     return this.rawSet.jointLimitsMax(this.handle, this.rawAxis());\n    // }\n    //\n    // public configureMotorModel(model: MotorModel) {\n    //     this.rawSet.jointConfigureMotorModel(this.handle, this.rawAxis(), model);\n    // }\n    //\n    // public configureMotorVelocity(targetVel: number, factor: number) {\n    //     this.rawSet.jointConfigureMotorVelocity(this.handle, this.rawAxis(), targetVel, factor);\n    // }\n    //\n    // public configureMotorPosition(targetPos: number, stiffness: number, damping: number) {\n    //     this.rawSet.jointConfigureMotorPosition(this.handle, this.rawAxis(), targetPos, stiffness, damping);\n    // }\n    //\n    // public configureMotor(targetPos: number, targetVel: number, stiffness: number, damping: number) {\n    //     this.rawSet.jointConfigureMotor(this.handle, this.rawAxis(), targetPos, targetVel, stiffness, damping);\n    // }\n}\n\nexport class FixedMultibodyJoint extends MultibodyJoint {}\n\nexport class PrismaticMultibodyJoint extends UnitMultibodyJoint {\n    public rawAxis(): RawJointAxis {\n        return RawJointAxis.LinX;\n    }\n}\n\nexport class RevoluteMultibodyJoint extends UnitMultibodyJoint {\n    public rawAxis(): RawJointAxis {\n        return RawJointAxis.AngX;\n    }\n}\n\n// #if DIM3\nexport class SphericalMultibodyJoint extends MultibodyJoint {\n    /* Unsupported by this alpha release.\n    public configureMotorModel(model: MotorModel) {\n        this.rawSet.jointConfigureMotorModel(this.handle, model);\n    }\n\n    public configureMotorVelocity(targetVel: Vector, factor: number) {\n        this.rawSet.jointConfigureBallMotorVelocity(this.handle, targetVel.x, targetVel.y, targetVel.z, factor);\n    }\n\n    public configureMotorPosition(targetPos: Quaternion, stiffness: number, damping: number) {\n        this.rawSet.jointConfigureBallMotorPosition(this.handle, targetPos.w, targetPos.x, targetPos.y, targetPos.z, stiffness, damping);\n    }\n\n    public configureMotor(targetPos: Quaternion, targetVel: Vector, stiffness: number, damping: number) {\n        this.rawSet.jointConfigureBallMotor(this.handle,\n            targetPos.w, targetPos.x, targetPos.y, targetPos.z,\n            targetVel.x, targetVel.y, targetVel.z,\n            stiffness, damping);\n    }\n     */\n}\n// #endif\n","import {RawMultibodyJointSet} from \"../raw\";\nimport {Coarena} from \"../coarena\";\nimport {RigidBodySet} from \"./rigid_body_set\";\nimport {\n    MultibodyJoint,\n    MultibodyJointHandle,\n    RevoluteMultibodyJoint,\n    FixedMultibodyJoint,\n    PrismaticMultibodyJoint,\n    // #if DIM3\n    SphericalMultibodyJoint,\n    // #endif\n} from \"./multibody_joint\";\nimport {ImpulseJointHandle, JointData, JointType} from \"./impulse_joint\";\nimport {IslandManager} from \"./island_manager\";\nimport {ColliderHandle} from \"../geometry\";\nimport {RigidBodyHandle} from \"./rigid_body\";\n\n/**\n * A set of joints.\n *\n * To avoid leaking WASM resources, this MUST be freed manually with `jointSet.free()`\n * once you are done using it (and all the joints it created).\n */\nexport class MultibodyJointSet {\n    raw: RawMultibodyJointSet;\n    private map: Coarena<MultibodyJoint>;\n\n    /**\n     * Release the WASM memory occupied by this joint set.\n     */\n    public free() {\n        if (!!this.raw) {\n            this.raw.free();\n        }\n        this.raw = undefined;\n\n        if (!!this.map) {\n            this.map.clear();\n        }\n        this.map = undefined;\n    }\n\n    constructor(raw?: RawMultibodyJointSet) {\n        this.raw = raw || new RawMultibodyJointSet();\n        this.map = new Coarena<MultibodyJoint>();\n        // Initialize the map with the existing elements, if any.\n        if (raw) {\n            raw.forEachJointHandle((handle: MultibodyJointHandle) => {\n                this.map.set(handle, MultibodyJoint.newTyped(this.raw, handle));\n            });\n        }\n    }\n\n    /**\n     * Creates a new joint and return its integer handle.\n     *\n     * @param desc - The joint's parameters.\n     * @param parent1 - The handle of the first rigid-body this joint is attached to.\n     * @param parent2 - The handle of the second rigid-body this joint is attached to.\n     * @param wakeUp - Should the attached rigid-bodies be awakened?\n     */\n    public createJoint(\n        desc: JointData,\n        parent1: RigidBodyHandle,\n        parent2: RigidBodyHandle,\n        wakeUp: boolean,\n    ): MultibodyJoint {\n        const rawParams = desc.intoRaw();\n        const handle = this.raw.createJoint(\n            rawParams,\n            parent1,\n            parent2,\n            wakeUp,\n        );\n        rawParams.free();\n        let joint = MultibodyJoint.newTyped(this.raw, handle);\n        this.map.set(handle, joint);\n        return joint;\n    }\n\n    /**\n     * Remove a joint from this set.\n     *\n     * @param handle - The integer handle of the joint.\n     * @param wake_up - If `true`, the rigid-bodies attached by the removed joint will be woken-up automatically.\n     */\n    public remove(handle: MultibodyJointHandle, wake_up: boolean) {\n        this.raw.remove(handle, wake_up);\n        this.map.delete(handle);\n    }\n\n    /**\n     * Internal function, do not call directly.\n     * @param handle\n     */\n    public unmap(handle: MultibodyJointHandle) {\n        this.map.delete(handle);\n    }\n\n    /**\n     * Drops the wrappers of the joints the engine removed on its own (the joints of removed\n     * soft bodies and clusters).\n     */\n    public unmapRemovedJoints() {\n        for (let joint of this.map.getAll()) {\n            if (!this.raw.contains(joint.handle)) {\n                this.map.delete(joint.handle);\n            }\n        }\n    }\n\n    /**\n     * The number of joints on this set.\n     */\n    public len(): number {\n        return this.map.len();\n    }\n\n    /**\n     * Does this set contain a joint with the given handle?\n     *\n     * @param handle - The joint handle to check.\n     */\n    public contains(handle: MultibodyJointHandle): boolean {\n        return this.get(handle) != null;\n    }\n\n    /**\n     * Gets the joint with the given handle.\n     *\n     * Returns `null` if no joint with the specified handle exists.\n     *\n     * @param handle - The integer handle of the joint to retrieve.\n     */\n    public get(handle: MultibodyJointHandle): MultibodyJoint | null {\n        return this.map.get(handle);\n    }\n\n    /**\n     * Applies the given closure to each joint contained by this set.\n     *\n     * @param f - The closure to apply.\n     */\n    public forEach(f: (joint: MultibodyJoint) => void) {\n        this.map.forEach(f);\n    }\n\n    /**\n     * Calls the given closure with the integer handle of each multibody joint attached to this rigid-body.\n     *\n     * @param f - The closure called with the integer handle of each multibody joint attached to the rigid-body.\n     */\n    public forEachJointHandleAttachedToRigidBody(\n        handle: RigidBodyHandle,\n        f: (handle: MultibodyJointHandle) => void,\n    ) {\n        this.raw.forEachJointAttachedToRigidBody(handle, f);\n    }\n\n    /**\n     * Gets all joints in the list.\n     *\n     * @returns joint list.\n     */\n    public getAll(): MultibodyJoint[] {\n        return this.map.getAll();\n    }\n}\n","import {RawCCDSolver} from \"../raw\";\n\n/**\n * The CCD solver responsible for resolving Continuous Collision Detection.\n *\n * To avoid leaking WASM resources, this MUST be freed manually with `ccdSolver.free()`\n * once you are done using it.\n */\nexport class CCDSolver {\n    raw: RawCCDSolver;\n\n    /**\n     * Release the WASM memory occupied by this narrow-phase.\n     */\n    public free() {\n        if (!!this.raw) {\n            this.raw.free();\n        }\n        this.raw = undefined;\n    }\n\n    constructor(raw?: RawCCDSolver) {\n        this.raw = raw || new RawCCDSolver();\n    }\n}\n","import {RawIslandManager} from \"../raw\";\nimport {RigidBodyHandle} from \"./rigid_body\";\n\n/**\n * The CCD solver responsible for resolving Continuous Collision Detection.\n *\n * To avoid leaking WASM resources, this MUST be freed manually with `ccdSolver.free()`\n * once you are done using it.\n */\nexport class IslandManager {\n    raw: RawIslandManager;\n\n    /**\n     * Release the WASM memory occupied by this narrow-phase.\n     */\n    public free() {\n        if (!!this.raw) {\n            this.raw.free();\n        }\n        this.raw = undefined;\n    }\n\n    constructor(raw?: RawIslandManager) {\n        this.raw = raw || new RawIslandManager();\n    }\n\n    /**\n     * Applies the given closure to the handle of each active rigid-bodies contained by this set.\n     *\n     * A rigid-body is active if it is not sleeping, i.e., if it moved recently.\n     *\n     * @param f - The closure to apply.\n     */\n    public forEachActiveRigidBodyHandle(f: (handle: RigidBodyHandle) => void) {\n        this.raw.forEachActiveRigidBodyHandle(f);\n    }\n}\n","import {RawSoftBodySet, RawSoftBodyTearEvent} from \"../raw\";\nimport {Coarena} from \"../coarena\";\nimport {VectorOps, Vector} from \"../math\";\nimport {\n    SoftBody,\n    SoftBodyDesc,\n    SoftBodyHandle,\n    SoftBodyTearEvent,\n} from \"./soft_body\";\nimport {RigidBodySet} from \"./rigid_body_set\";\nimport {ColliderSet} from \"../geometry\";\nimport {ImpulseJointSet} from \"./impulse_joint_set\";\nimport {MultibodyJointSet} from \"./multibody_joint_set\";\nimport {IslandManager} from \"./island_manager\";\n\n/**\n * A set of soft bodies that can be handled by a physics pipeline.\n *\n * To avoid leaking WASM resources, this MUST be freed manually with `softBodySet.free()`\n * once you are done using it (and all the soft bodies it created).\n */\nexport class SoftBodySet {\n    raw: RawSoftBodySet;\n    private map: Coarena<SoftBody>;\n\n    /**\n     * Release the WASM memory occupied by this soft-body set.\n     */\n    public free() {\n        if (!!this.raw) {\n            this.raw.free();\n        }\n        this.raw = undefined;\n\n        if (!!this.map) {\n            this.map.clear();\n        }\n        this.map = undefined;\n    }\n\n    constructor(raw?: RawSoftBodySet) {\n        this.raw = raw || new RawSoftBodySet();\n        this.map = new Coarena<SoftBody>();\n        // deserialize\n        if (raw) {\n            raw.forEachSoftBodyHandle((handle: SoftBodyHandle) => {\n                this.map.set(handle, new SoftBody(raw, null, null, handle));\n            });\n        }\n    }\n\n    /**\n     * Internal method, do not call this explicitly.\n     */\n    public finalizeDeserialization(\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n    ) {\n        this.map.forEach((sb) => sb.finalizeDeserialization(bodies, colliders));\n    }\n\n    /**\n     * Creates a new soft body, its hidden root rigid body and its colliders, and returns it.\n     *\n     * @param bodies - The set of rigid bodies receiving the body's proxies.\n     * @param colliders - The set of colliders receiving the body's colliders.\n     * @param desc - The description of the soft body to create.\n     */\n    public createSoftBody(\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n        desc: SoftBodyDesc,\n    ): SoftBody {\n        let rawBuilder = desc.intoRaw();\n        let handle = this.raw.insert(rawBuilder, bodies.raw, colliders.raw);\n        rawBuilder.free();\n\n        // Map the proxies and colliders the insertion created.\n        bodies.mapNewBodies(colliders);\n        colliders.mapNewColliders(bodies);\n\n        const body = new SoftBody(this.raw, bodies, colliders, handle);\n        body.userData = desc.userData;\n        this.map.set(handle, body);\n        return body;\n    }\n\n    /**\n     * Removes a soft body from this set, with its proxies, colliders and attached joints.\n     */\n    public remove(\n        handle: SoftBodyHandle,\n        islands: IslandManager,\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n        impulseJoints: ImpulseJointSet,\n        multibodyJoints: MultibodyJointSet,\n    ) {\n        this.raw.remove(\n            handle,\n            islands.raw,\n            bodies.raw,\n            colliders.raw,\n            impulseJoints.raw,\n            multibodyJoints.raw,\n        );\n        this.map.delete(handle);\n        // Unmap the proxies, colliders and joints that were removed with the soft body.\n        bodies.unmapRemovedBodies();\n        colliders.unmapRemovedColliders();\n        impulseJoints.unmapRemovedJoints();\n        multibodyJoints.unmapRemovedJoints();\n    }\n\n    /**\n     * Adds a cluster over the given particles: a rigid proxy that joints and colliders can\n     * attach to. Returns the cluster's index, or `null` if no particle was valid.\n     */\n    public addCluster(\n        handle: SoftBodyHandle,\n        particles: Uint32Array | number[],\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n    ): number | null {\n        let cluster = this.raw.addCluster(\n            handle,\n            Uint32Array.from(particles),\n            bodies.raw,\n            colliders.raw,\n        );\n        bodies.mapNewBodies(colliders);\n        return cluster === undefined ? null : cluster;\n    }\n\n    /**\n     * Removes a cluster with its proxy, colliders and joints. Returns `false` if the cluster\n     * did not exist.\n     */\n    public removeCluster(\n        handle: SoftBodyHandle,\n        cluster: number,\n        islands: IslandManager,\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n        impulseJoints: ImpulseJointSet,\n        multibodyJoints: MultibodyJointSet,\n    ): boolean {\n        let removed = this.raw.removeCluster(\n            handle,\n            cluster,\n            islands.raw,\n            bodies.raw,\n            colliders.raw,\n            impulseJoints.raw,\n            multibodyJoints.raw,\n        );\n        bodies.unmapRemovedBodies();\n        colliders.unmapRemovedColliders();\n        impulseJoints.unmapRemovedJoints();\n        multibodyJoints.unmapRemovedJoints();\n        return removed;\n    }\n\n    /**\n     * Tears a soft body at once along the given edges and through the given cells, without\n     * removing material. Pieces disconnected by the tear become soft bodies of their own.\n     *\n     * Returns the tear event (which must be freed), or `null` when nothing changed.\n     */\n    public tear(\n        handle: SoftBodyHandle,\n        edges: Uint32Array | number[],\n        cells: Uint32Array | number[],\n        islands: IslandManager,\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n        impulseJoints: ImpulseJointSet,\n        multibodyJoints: MultibodyJointSet,\n    ): SoftBodyTearEvent | null {\n        let raw = this.raw.tear(\n            handle,\n            Uint32Array.from(edges),\n            Uint32Array.from(cells),\n            islands.raw,\n            bodies.raw,\n            colliders.raw,\n            impulseJoints.raw,\n            multibodyJoints.raw,\n        );\n        return this.finishTopologyChange(\n            raw,\n            bodies,\n            colliders,\n            impulseJoints,\n            multibodyJoints,\n        );\n    }\n\n    /**\n     * Cuts a soft body along a blade: a segment (two points) in 2D, a triangle (three points)\n     * in 3D. Pieces disconnected by the cut become soft bodies of their own.\n     *\n     * Returns the tear event (which must be freed), or `null` when nothing changed.\n     */\n    public cut(\n        handle: SoftBodyHandle,\n        blade: Vector[],\n        islands: IslandManager,\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n        impulseJoints: ImpulseJointSet,\n        multibodyJoints: MultibodyJointSet,\n    ): SoftBodyTearEvent | null {\n        let flat: number[] = [];\n        for (let point of blade) {\n            flat.push(point.x, point.y);\n            // #if DIM3\n            flat.push(point.z);\n            // #endif\n        }\n        let raw = this.raw.cut(\n            handle,\n            Float32Array.from(flat),\n            islands.raw,\n            bodies.raw,\n            colliders.raw,\n            impulseJoints.raw,\n            multibodyJoints.raw,\n        );\n        return this.finishTopologyChange(\n            raw,\n            bodies,\n            colliders,\n            impulseJoints,\n            multibodyJoints,\n        );\n    }\n\n    /**\n     * Maps the soft bodies, proxies and colliders a topology change created, and unmaps what\n     * it removed.\n     */\n    private finishTopologyChange(\n        raw: RawSoftBodyTearEvent | undefined,\n        bodies: RigidBodySet,\n        colliders: ColliderSet,\n        impulseJoints: ImpulseJointSet,\n        multibodyJoints: MultibodyJointSet,\n    ): SoftBodyTearEvent | null {\n        if (!raw) {\n            return null;\n        }\n        this.mapNewSoftBodies(bodies, colliders);\n        bodies.mapNewBodies(colliders);\n        colliders.mapNewColliders(bodies);\n        bodies.unmapRemovedBodies();\n        colliders.unmapRemovedColliders();\n        impulseJoints.unmapRemovedJoints();\n        multibodyJoints.unmapRemovedJoints();\n        return new SoftBodyTearEvent(raw);\n    }\n\n    /**\n     * Wraps the soft bodies the engine created (the pieces a tear split off) that have no\n     * JavaScript wrapper yet; the pieces of a tear event are only reachable after this.\n     */\n    public mapNewSoftBodies(bodies: RigidBodySet, colliders: ColliderSet) {\n        this.raw.forEachSoftBodyHandle((handle: SoftBodyHandle) => {\n            if (!this.map.get(handle)) {\n                this.map.set(\n                    handle,\n                    new SoftBody(this.raw, bodies, colliders, handle),\n                );\n            }\n        });\n    }\n\n    /**\n     * Wakes a soft body and everything it touches up.\n     *\n     * @param strong - If `true` the bodies stay awake for a while even if they are at rest.\n     */\n    public wakeUp(\n        handle: SoftBodyHandle,\n        bodies: RigidBodySet,\n        strong: boolean,\n    ) {\n        this.raw.wakeUp(handle, bodies.raw, strong);\n    }\n\n    /**\n     * The number of soft bodies on this set.\n     */\n    public len(): number {\n        return this.map.len();\n    }\n\n    /**\n     * Does this set contain a soft body with the given handle?\n     */\n    public contains(handle: SoftBodyHandle): boolean {\n        return this.get(handle) != null;\n    }\n\n    /**\n     * Gets the soft body with the given handle.\n     */\n    public get(handle: SoftBodyHandle): SoftBody | null {\n        return this.map.get(handle);\n    }\n\n    /**\n     * Applies the given closure to each soft body contained by this set.\n     */\n    public forEach(f: (body: SoftBody) => void) {\n        this.map.forEach(f);\n    }\n\n    /**\n     * Gets all soft bodies in the list.\n     */\n    public getAll(): SoftBody[] {\n        return this.map.getAll();\n    }\n}\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    if (typeof b !== \"function\" && b !== null)\r\n        throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    var desc = Object.getOwnPropertyDescriptor(m, k);\r\n    if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n        desc = { enumerable: true, get: function() { return m[k]; } };\r\n    }\r\n    Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n        if (ar || !(i in from)) {\r\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n            ar[i] = from[i];\r\n        }\r\n    }\r\n    return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n    o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n    __setModuleDefault(result, mod);\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n    if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n    return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n    if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n    return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  var i\n  for (i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n","// @ts-ignore\nimport wasmBase64 from \"../pkg/dist/rapier_wasm3d_bg.wasm\";\nimport wasmInit from \"../pkg/dist/rapier_wasm3d\";\nimport base64 from \"base64-js\";\n\n/**\n * Initializes RAPIER.\n * Has to be called and awaited before using any library methods.\n */\nexport async function init() {\n    await wasmInit({\n        module_or_path: base64.toByteArray(wasmBase64 as unknown as string)\n            .buffer,\n    });\n}\n","import {version as vers, reserve_memory as reserve} from \"./raw\";\n\nexport function version(): string {\n    return vers();\n}\n\n/// Reserves additional memory in WASM land.\n///\n/// This will grow the internal WASM memory buffer so that it can fit at least\n/// the specified amount of extra bytes. This can help reduce future runtime\n/// overhead due to dynamic internal memory growth once the limit of the\n/// pre-allocated memory is reached.\n///\n/// This feature is still experimental. Due to the nature of the internal\n/// allocator, there can be situations where the allocator decides to perform\n/// additional internal memory growth even though not all `extraBytesCount`\n/// are occupied yet.\nexport function reserveMemory(extraBytesCount: number) {\n    reserve(extraBytesCount);\n}\n\nexport * from \"./math\";\nexport * from \"./dynamics\";\nexport * from \"./geometry\";\nexport * from \"./pipeline\";\nexport * from \"./init\";\nexport * from \"./control\";\n"],"names":["RawBroadPhase","static","ptr","obj","Object","create","prototype","__wbg_ptr","RawBroadPhaseFinalization","register","__destroy_into_raw","this","unregister","free","wasm","__wbg_rawbroadphase_free","castRayAndGetNormal","narrow_phase","bodies","colliders","rayOrig","rayDir","maxToi","solid","filter_flags","filter_groups","filter_exclude_collider","filter_exclude_rigid_body","filter_predicate","_assertClass","RawNarrowPhase","RawRigidBodySet","RawColliderSet","RawVector","ret","rawbroadphase_castRayAndGetNormal","isLikeNone","Number","MAX_SAFE_INTEGER","addBorrowedObject","undefined","RawRayColliderIntersection","__wrap","heap","stack_pointer","castRay","rawbroadphase_castRay","RawRayColliderHit","castShape","shapePos","shapeRot","shapeVel","shape","target_distance","stop_at_penetration","RawRotation","RawShape","rawbroadphase_castShape","RawColliderShapeCastHit","collidersWithAabbIntersectingAabb","aabbCenter","aabbHalfExtents","callback","rawbroadphase_collidersWithAabbIntersectingAabb","intersectionWithShape","retptr","__wbindgen_add_to_stack_pointer","rawbroadphase_intersectionWithShape","r0","getDataViewMemory0","getInt32","r2","getFloat64","intersectionsWithPoint","point","rawbroadphase_intersectionsWithPoint","intersectionsWithRay","rawbroadphase_intersectionsWithRay","intersectionsWithShape","rawbroadphase_intersectionsWithShape","constructor","rawbroadphase_new","projectPointAndGetFeature","rawbroadphase_projectPointAndGetFeature","RawPointColliderProjection","projectPoint","rawbroadphase_projectPoint","Symbol","dispose","RawCCDSolver","RawCCDSolverFinalization","__wbg_rawccdsolver_free","rawccdsolver_new","RawCharacterCollision","RawCharacterCollisionFinalization","__wbg_rawcharactercollision_free","handle","rawcharactercollision_handle","rawcharactercollision_new","toi","rawcharactercollision_toi","translationDeltaApplied","scratch_buffer","rawcharactercollision_translationDeltaApplied","translationDeltaRemaining","rawcharactercollision_translationDeltaRemaining","worldNormal1","rawcharactercollision_worldNormal1","worldNormal2","rawcharactercollision_worldNormal2","worldWitness1","rawcharactercollision_worldWitness1","worldWitness2","rawcharactercollision_worldWitness2","RawColliderSetFinalization","__wbg_rawcolliderset_free","coActiveCollisionTypes","rawcolliderset_coActiveCollisionTypes","coActiveEvents","rawcolliderset_coActiveEvents","coActiveHooks","rawcolliderset_coActiveHooks","coCastCollider","collider1Vel","collider2handle","collider2Vel","max_toi","rawcolliderset_coCastCollider","coCastRayAndGetNormal","rawcolliderset_coCastRayAndGetNormal","RawRayIntersection","coCastRay","rawcolliderset_coCastRay","coCastShape","colliderVel","shape2","shape2Pos","shape2Rot","shape2Vel","rawcolliderset_coCastShape","RawShapeCastHit","coCollisionGroups","rawcolliderset_coCollisionGroups","coCombineVoxelStates","handle1","handle2","shift_x","shift_y","shift_z","rawcolliderset_coCombineVoxelStates","coCompoundFlags","rawcolliderset_coCompoundFlags","coContactCollider","prediction","rawcolliderset_coContactCollider","RawShapeContact","coContactForceEventThreshold","rawcolliderset_coContactForceEventThreshold","coContactShape","shapePos2","shapeRot2","rawcolliderset_coContactShape","coContactSkin","rawcolliderset_coContactSkin","coContainsPoint","rawcolliderset_coContainsPoint","coDensity","rawcolliderset_coDensity","coFrictionCombineRule","rawcolliderset_coFrictionCombineRule","coFriction","rawcolliderset_coFriction","coHalfExtents","rawcolliderset_coHalfExtents","coHalfHeight","rawcolliderset_coHalfHeight","coHalfspaceNormal","rawcolliderset_coHalfspaceNormal","coHeightFieldFlags","rawcolliderset_coHeightFieldFlags","coHeightfieldHeights","rawcolliderset_coHeightfieldHeights","r1","v1","getArrayF32FromWasm0","slice","__wbindgen_export2","coHeightfieldNCols","rawcolliderset_coHeightfieldNCols","coHeightfieldNRows","rawcolliderset_coHeightfieldNRows","coHeightfieldScale","rawcolliderset_coHeightfieldScale","coIndices","rawcolliderset_coIndices","getArrayU32FromWasm0","coIntersectsRay","rawcolliderset_coIntersectsRay","coIntersectsShape","rawcolliderset_coIntersectsShape","coIsDeformable","rawcolliderset_coIsDeformable","coIsEnabled","rawcolliderset_coIsEnabled","coIsSensor","rawcolliderset_coIsSensor","coMass","rawcolliderset_coMass","coParent","rawcolliderset_coParent","coPolylineFlags","rawcolliderset_coPolylineFlags","coProjectPoint","rawcolliderset_coProjectPoint","RawPointProjection","coPropagateVoxelChange","ix","iy","iz","rawcolliderset_coPropagateVoxelChange","coRadius","rawcolliderset_coRadius","coRestitutionCombineRule","rawcolliderset_coRestitutionCombineRule","coRestitution","rawcolliderset_coRestitution","coRotationWrtParent","rawcolliderset_coRotationWrtParent","coRotation","rawcolliderset_coRotation","coRoundRadius","rawcolliderset_coRoundRadius","coSetActiveCollisionTypes","types","rawcolliderset_coSetActiveCollisionTypes","coSetActiveEvents","events","rawcolliderset_coSetActiveEvents","coSetActiveHooks","hooks","rawcolliderset_coSetActiveHooks","coSetCollisionGroups","groups","rawcolliderset_coSetCollisionGroups","coSetContactForceEventThreshold","threshold","rawcolliderset_coSetContactForceEventThreshold","coSetContactSkin","contact_skin","rawcolliderset_coSetContactSkin","coSetDensity","density","rawcolliderset_coSetDensity","coSetEnabled","enabled","rawcolliderset_coSetEnabled","coSetFrictionCombineRule","rule","rawcolliderset_coSetFrictionCombineRule","coSetFriction","friction","rawcolliderset_coSetFriction","coSetHalfExtents","newHalfExtents","rawcolliderset_coSetHalfExtents","coSetHalfHeight","newHalfheight","rawcolliderset_coSetHalfHeight","coSetMassProperties","mass","centerOfMass","principalAngularInertia","angularInertiaFrame","rawcolliderset_coSetMassProperties","coSetMass","rawcolliderset_coSetMass","coSetRadius","newRadius","rawcolliderset_coSetRadius","coSetRestitutionCombineRule","rawcolliderset_coSetRestitutionCombineRule","coSetRestitution","restitution","rawcolliderset_coSetRestitution","coSetRotationWrtParent","x","y","z","w","rawcolliderset_coSetRotationWrtParent","coSetRotation","rawcolliderset_coSetRotation","coSetRoundRadius","newBorderRadius","rawcolliderset_coSetRoundRadius","coSetSensor","is_sensor","rawcolliderset_coSetSensor","coSetShape","rawcolliderset_coSetShape","coSetSolverGroups","rawcolliderset_coSetSolverGroups","coSetTranslationWrtParent","rawcolliderset_coSetTranslationWrtParent","coSetTranslation","rawcolliderset_coSetTranslation","coSetVoxel","filled","rawcolliderset_coSetVoxel","coShapeType","rawcolliderset_coShapeType","coShape","rawcolliderset_coShape","coSoftBody","rawcolliderset_coSoftBody","coSolverGroups","rawcolliderset_coSolverGroups","coTranslationWrtParent","rawcolliderset_coTranslationWrtParent","coTranslation","rawcolliderset_coTranslation","coTriMeshFlags","rawcolliderset_coTriMeshFlags","coVertices","rawcolliderset_coVertices","coVolume","rawcolliderset_coVolume","coVoxelData","rawcolliderset_coVoxelData","getArrayI32FromWasm0","coVoxelSize","rawcolliderset_coVoxelSize","contains","rawcolliderset_contains","createCollider","translation","rotation","massPropsMode","frictionCombineRule","restitutionCombineRule","isSensor","collisionGroups","solverGroups","activeCollisionTypes","activeHooks","activeEvents","contactForceEventThreshold","contactSkin","hasParent","parent","rawcolliderset_createCollider","createDeformableCollider","bindingMode","bindingParticles","bindingEps","bindingSelfContacts","softBodies","ptr0","passArray32ToWasm0","__wbindgen_export3","len0","WASM_VECTOR_LEN","RawSoftBodySet","rawcolliderset_createDeformableCollider","forEachColliderHandle","f","rawcolliderset_forEachColliderHandle","isHandleValid","rawcolliderset_isHandleValid","len","rawcolliderset_len","rawcolliderset_new","remove","islands","wakeUp","RawIslandManager","rawcolliderset_remove","RawColliderShapeCastHitFinalization","__wbg_rawcollidershapecasthit_free","colliderHandle","rawcollidershapecasthit_colliderHandle","getComponents","rawcollidershapecasthit_getComponents","RawContactForceEvent","RawContactForceEventFinalization","__wbg_rawcontactforceevent_free","collider1","rawcontactforceevent_collider1","collider2","rawcontactforceevent_collider2","max_force_direction","rawcontactforceevent_max_force_direction","max_force_magnitude","rawcontactforceevent_max_force_magnitude","total_force","rawcontactforceevent_total_force","total_force_magnitude","rawcontactforceevent_total_force_magnitude","RawContactManifold","RawContactManifoldFinalization","__wbg_rawcontactmanifold_free","contact_dist","i","rawcontactmanifold_contact_dist","contact_fid1","rawcontactmanifold_contact_fid1","contact_fid2","rawcontactmanifold_contact_fid2","contact_impulse","rawcontactmanifold_contact_impulse","contact_local_p1","rawcontactmanifold_contact_local_p1","contact_local_p2","rawcontactmanifold_contact_local_p2","contact_tangent_impulse_x","rawcontactmanifold_contact_tangent_impulse_x","contact_tangent_impulse_y","rawcontactmanifold_contact_tangent_impulse_y","rawcontactmanifold_friction","local_n1","rawcontactmanifold_local_n1","local_n2","rawcontactmanifold_local_n2","normal","rawcontactmanifold_normal","num_contacts","rawcontactmanifold_num_contacts","num_solver_contacts","rawcontactmanifold_num_solver_contacts","rawcontactmanifold_restitution","solver_contact_dist","rawcontactmanifold_solver_contact_dist","solver_contact_point","rawcontactmanifold_solver_contact_point","solver_contact_tangent_velocity","rawcontactmanifold_solver_contact_tangent_velocity","subshape1","rawcontactmanifold_subshape1","subshape2","rawcontactmanifold_subshape2","RawContactPair","RawContactPairFinalization","__wbg_rawcontactpair_free","rawcontactpair_collider1","rawcontactpair_collider2","contactManifold","rawcontactpair_contactManifold","numContactManifolds","rawcontactpair_numContactManifolds","RawConvexMeshData","RawConvexMeshDataFinalization","__wbg_rawconvexmeshdata_free","indices","__wbg_get_rawconvexmeshdata_indices","vertices","__wbg_get_rawconvexmeshdata_vertices","arg0","__wbg_set_rawconvexmeshdata_indices","passArrayF32ToWasm0","__wbg_set_rawconvexmeshdata_vertices","RawDebugRenderPipeline","RawDebugRenderPipelineFinalization","__wbg_rawdebugrenderpipeline_free","colors","takeObject","rawdebugrenderpipeline_colors","rawdebugrenderpipeline_new","render","soft_bodies","impulse_joints","multibody_joints","RawImpulseJointSet","RawMultibodyJointSet","rawdebugrenderpipeline_render","rawdebugrenderpipeline_vertices","RawDeserializedWorld","RawDeserializedWorldFinalization","__wbg_rawdeserializedworld_free","takeBodies","rawdeserializedworld_takeBodies","takeBroadPhase","rawdeserializedworld_takeBroadPhase","takeColliders","rawdeserializedworld_takeColliders","takeGravity","rawdeserializedworld_takeGravity","takeImpulseJoints","rawdeserializedworld_takeImpulseJoints","takeIntegrationParameters","rawdeserializedworld_takeIntegrationParameters","RawIntegrationParameters","takeIslandManager","rawdeserializedworld_takeIslandManager","takeMultibodyJoints","rawdeserializedworld_takeMultibodyJoints","takeNarrowPhase","rawdeserializedworld_takeNarrowPhase","takeSoftBodies","rawdeserializedworld_takeSoftBodies","RawDynamicRayCastVehicleController","RawDynamicRayCastVehicleControllerFinalization","__wbg_rawdynamicraycastvehiclecontroller_free","add_wheel","chassis_connection_cs","direction_cs","axle_cs","suspension_rest_length","radius","rawdynamicraycastvehiclecontroller_add_wheel","chassis","rawdynamicraycastvehiclecontroller_chassis","current_vehicle_speed","rawdynamicraycastvehiclecontroller_current_vehicle_speed","index_forward_axis","rawdynamicraycastvehiclecontroller_index_forward_axis","index_up_axis","rawdynamicraycastvehiclecontroller_index_up_axis","rawdynamicraycastvehiclecontroller_new","num_wheels","rawdynamicraycastvehiclecontroller_num_wheels","set_index_forward_axis","axis","rawdynamicraycastvehiclecontroller_set_index_forward_axis","set_index_up_axis","rawdynamicraycastvehiclecontroller_set_index_up_axis","set_wheel_axle_cs","value","rawdynamicraycastvehiclecontroller_set_wheel_axle_cs","set_wheel_brake","rawdynamicraycastvehiclecontroller_set_wheel_brake","set_wheel_chassis_connection_point_cs","rawdynamicraycastvehiclecontroller_set_wheel_chassis_connection_point_cs","set_wheel_direction_cs","rawdynamicraycastvehiclecontroller_set_wheel_direction_cs","set_wheel_engine_force","rawdynamicraycastvehiclecontroller_set_wheel_engine_force","set_wheel_friction_slip","rawdynamicraycastvehiclecontroller_set_wheel_friction_slip","set_wheel_max_suspension_force","rawdynamicraycastvehiclecontroller_set_wheel_max_suspension_force","set_wheel_max_suspension_travel","rawdynamicraycastvehiclecontroller_set_wheel_max_suspension_travel","set_wheel_radius","rawdynamicraycastvehiclecontroller_set_wheel_radius","set_wheel_side_friction_stiffness","stiffness","rawdynamicraycastvehiclecontroller_set_wheel_side_friction_stiffness","set_wheel_steering","rawdynamicraycastvehiclecontroller_set_wheel_steering","set_wheel_suspension_compression","rawdynamicraycastvehiclecontroller_set_wheel_suspension_compression","set_wheel_suspension_relaxation","rawdynamicraycastvehiclecontroller_set_wheel_suspension_relaxation","set_wheel_suspension_rest_length","rawdynamicraycastvehiclecontroller_set_wheel_suspension_rest_length","set_wheel_suspension_stiffness","rawdynamicraycastvehiclecontroller_set_wheel_suspension_stiffness","update_vehicle","dt","broad_phase","rawdynamicraycastvehiclecontroller_update_vehicle","wheel_axle_cs","rawdynamicraycastvehiclecontroller_wheel_axle_cs","wheel_brake","rawdynamicraycastvehiclecontroller_wheel_brake","wheel_chassis_connection_point_cs","rawdynamicraycastvehiclecontroller_wheel_chassis_connection_point_cs","wheel_contact_normal_ws","rawdynamicraycastvehiclecontroller_wheel_contact_normal_ws","wheel_contact_point_ws","rawdynamicraycastvehiclecontroller_wheel_contact_point_ws","wheel_direction_cs","rawdynamicraycastvehiclecontroller_wheel_direction_cs","wheel_engine_force","rawdynamicraycastvehiclecontroller_wheel_engine_force","wheel_forward_impulse","rawdynamicraycastvehiclecontroller_wheel_forward_impulse","wheel_friction_slip","rawdynamicraycastvehiclecontroller_wheel_friction_slip","wheel_ground_object","rawdynamicraycastvehiclecontroller_wheel_ground_object","wheel_hard_point_ws","rawdynamicraycastvehiclecontroller_wheel_hard_point_ws","wheel_is_in_contact","rawdynamicraycastvehiclecontroller_wheel_is_in_contact","wheel_max_suspension_force","rawdynamicraycastvehiclecontroller_wheel_max_suspension_force","wheel_max_suspension_travel","rawdynamicraycastvehiclecontroller_wheel_max_suspension_travel","wheel_radius","rawdynamicraycastvehiclecontroller_wheel_radius","wheel_rotation","rawdynamicraycastvehiclecontroller_wheel_rotation","wheel_side_friction_stiffness","rawdynamicraycastvehiclecontroller_wheel_side_friction_stiffness","wheel_side_impulse","rawdynamicraycastvehiclecontroller_wheel_side_impulse","wheel_steering","rawdynamicraycastvehiclecontroller_wheel_steering","wheel_suspension_compression","rawdynamicraycastvehiclecontroller_wheel_suspension_compression","wheel_suspension_force","rawdynamicraycastvehiclecontroller_wheel_suspension_force","wheel_suspension_length","rawdynamicraycastvehiclecontroller_wheel_suspension_length","wheel_suspension_relaxation","rawdynamicraycastvehiclecontroller_wheel_suspension_relaxation","wheel_suspension_rest_length","rawdynamicraycastvehiclecontroller_wheel_suspension_rest_length","wheel_suspension_stiffness","rawdynamicraycastvehiclecontroller_wheel_suspension_stiffness","RawEventQueue","RawEventQueueFinalization","__wbg_raweventqueue_free","clear","raweventqueue_clear","drainCollisionEvents","raweventqueue_drainCollisionEvents","drainContactForceEvents","raweventqueue_drainContactForceEvents","drainSoftBodyTearEvents","raweventqueue_drainSoftBodyTearEvents","autoDrain","raweventqueue_new","freeze","Vertex","Edge","Face","Unknown","RawGenericJoint","RawGenericJointFinalization","__wbg_rawgenericjoint_free","anchor1","axes1","anchor2","axes2","rawgenericjoint_fixed","lockedAxes","rawgenericjoint_generic","limitsEnabled","limitsMin","limitsMax","rawgenericjoint_prismatic","axis1","axis2","rawgenericjoint_revoluteWithAxes","rawgenericjoint_revolute","length","rawgenericjoint_rope","rawgenericjoint_spherical","rest_length","damping","rawgenericjoint_spring","RawImpulseJointSetFinalization","__wbg_rawimpulsejointset_free","rawimpulsejointset_contains","createJoint","params","parent1","parent2","wake_up","rawimpulsejointset_createJoint","forEachJointAttachedToRigidBody","body","rawimpulsejointset_forEachJointAttachedToRigidBody","forEachJointHandle","rawimpulsejointset_forEachJointHandle","jointAnchor1","rawimpulsejointset_jointAnchor1","jointAnchor2","rawimpulsejointset_jointAnchor2","jointBodyHandle1","rawimpulsejointset_jointBodyHandle1","jointBodyHandle2","rawimpulsejointset_jointBodyHandle2","jointConfigureMotorModel","model","rawimpulsejointset_jointConfigureMotorModel","jointConfigureMotorPosition","targetPos","rawimpulsejointset_jointConfigureMotorPosition","jointConfigureMotorVelocity","targetVel","factor","rawimpulsejointset_jointConfigureMotorVelocity","jointConfigureMotor","rawimpulsejointset_jointConfigureMotor","jointContactsEnabled","rawimpulsejointset_jointContactsEnabled","jointFrameX1","rawimpulsejointset_jointFrameX1","jointFrameX2","rawimpulsejointset_jointFrameX2","jointLimitsEnabled","rawimpulsejointset_jointLimitsEnabled","jointLimitsMax","rawimpulsejointset_jointLimitsMax","jointLimitsMin","rawimpulsejointset_jointLimitsMin","jointSetAnchor1","newPos","rawimpulsejointset_jointSetAnchor1","jointSetAnchor2","rawimpulsejointset_jointSetAnchor2","jointSetContactsEnabled","rawimpulsejointset_jointSetContactsEnabled","jointSetFrameX1","newRot","rawimpulsejointset_jointSetFrameX1","jointSetFrameX2","rawimpulsejointset_jointSetFrameX2","jointSetLimits","min","max","rawimpulsejointset_jointSetLimits","jointSetLocalFrame1","anchor","rot","rawimpulsejointset_jointSetLocalFrame1","jointSetLocalFrame2","rawimpulsejointset_jointSetLocalFrame2","jointSetMotorMaxForce","maxForce","rawimpulsejointset_jointSetMotorMaxForce","jointType","rawimpulsejointset_jointType","rawimpulsejointset_len","rawimpulsejointset_new","rawimpulsejointset_remove","RawIntegrationParametersFinalization","__wbg_rawintegrationparameters_free","contact_erp","rawintegrationparameters_contact_erp","rawintegrationparameters_dt","lengthUnit","rawintegrationparameters_lengthUnit","maxCcdSubsteps","rawintegrationparameters_maxCcdSubsteps","rawintegrationparameters_new","normalizedAllowedLinearError","rawintegrationparameters_normalizedAllowedLinearError","normalizedPredictionDistance","rawintegrationparameters_normalizedPredictionDistance","numInternalPgsIterations","rawintegrationparameters_numInternalPgsIterations","numSolverIterations","rawintegrationparameters_numSolverIterations","contact_natural_frequency","rawintegrationparameters_set_contact_natural_frequency","rawintegrationparameters_set_dt","rawintegrationparameters_set_lengthUnit","rawintegrationparameters_set_maxCcdSubsteps","rawintegrationparameters_set_normalizedAllowedLinearError","rawintegrationparameters_set_normalizedPredictionDistance","rawintegrationparameters_set_numInternalPgsIterations","rawintegrationparameters_set_numSolverIterations","softBodiesContactStiffening","rawintegrationparameters_set_softBodiesContactStiffening","softBodiesFemLinearTolerance","rawintegrationparameters_set_softBodiesFemLinearTolerance","softBodiesFemMaxDenseDofs","rawintegrationparameters_set_softBodiesFemMaxDenseDofs","softBodiesFemMaxLinearIterations","rawintegrationparameters_set_softBodiesFemMaxLinearIterations","softBodiesMaxExtraSubsteps","rawintegrationparameters_set_softBodiesMaxExtraSubsteps","softBodiesRecovery","RawSoftRecoverySettings","rawintegrationparameters_set_softBodiesRecovery","softBodiesResweepStrain","rawintegrationparameters_set_softBodiesResweepStrain","rawintegrationparameters_softBodiesContactStiffening","rawintegrationparameters_softBodiesFemLinearTolerance","rawintegrationparameters_softBodiesFemMaxDenseDofs","rawintegrationparameters_softBodiesFemMaxLinearIterations","rawintegrationparameters_softBodiesMaxExtraSubsteps","rawintegrationparameters_softBodiesRecovery","rawintegrationparameters_softBodiesResweepStrain","RawIslandManagerFinalization","__wbg_rawislandmanager_free","forEachActiveRigidBodyHandle","rawislandmanager_forEachActiveRigidBodyHandle","rawislandmanager_new","RawJointAxis","LinX","LinY","LinZ","AngX","AngY","AngZ","RawJointType","Revolute","Fixed","Prismatic","Rope","Spring","Spherical","Generic","RawKinematicCharacterController","RawKinematicCharacterControllerFinalization","__wbg_rawkinematiccharactercontroller_free","autostepEnabled","rawkinematiccharactercontroller_autostepEnabled","autostepIncludesDynamicBodies","rawkinematiccharactercontroller_autostepIncludesDynamicBodies","autostepMaxHeight","rawkinematiccharactercontroller_autostepMaxHeight","autostepMinWidth","rawkinematiccharactercontroller_autostepMinWidth","computeColliderMovement","collider_handle","desired_translation_delta","apply_impulses_to_dynamic_bodies","character_mass","rawkinematiccharactercontroller_computeColliderMovement","Math","fround","computedCollision","collision","rawkinematiccharactercontroller_computedCollision","computedGrounded","rawkinematiccharactercontroller_computedGrounded","computedMovement","rawkinematiccharactercontroller_computedMovement","disableAutostep","rawkinematiccharactercontroller_disableAutostep","disableSnapToGround","rawkinematiccharactercontroller_disableSnapToGround","enableAutostep","maxHeight","minWidth","includeDynamicBodies","rawkinematiccharactercontroller_enableAutostep","enableSnapToGround","distance","rawkinematiccharactercontroller_enableSnapToGround","maxSlopeClimbAngle","rawkinematiccharactercontroller_maxSlopeClimbAngle","minSlopeSlideAngle","rawkinematiccharactercontroller_minSlopeSlideAngle","offset","rawkinematiccharactercontroller_new","normalNudgeFactor","rawkinematiccharactercontroller_normalNudgeFactor","numComputedCollisions","rawkinematiccharactercontroller_numComputedCollisions","rawkinematiccharactercontroller_offset","setMaxSlopeClimbAngle","angle","rawkinematiccharactercontroller_setMaxSlopeClimbAngle","setMinSlopeSlideAngle","rawkinematiccharactercontroller_setMinSlopeSlideAngle","setNormalNudgeFactor","rawkinematiccharactercontroller_setNormalNudgeFactor","setOffset","rawkinematiccharactercontroller_setOffset","setSlideEnabled","rawkinematiccharactercontroller_setSlideEnabled","setUp","vector","rawkinematiccharactercontroller_setUp","slideEnabled","rawkinematiccharactercontroller_slideEnabled","snapToGroundDistance","rawkinematiccharactercontroller_snapToGroundDistance","snapToGroundEnabled","rawkinematiccharactercontroller_snapToGroundEnabled","up","rawkinematiccharactercontroller_up","AccelerationBased","ForceBased","RawMultibodyJointSetFinalization","__wbg_rawmultibodyjointset_free","rawmultibodyjointset_contains","rawmultibodyjointset_createJoint","rawmultibodyjointset_forEachJointAttachedToRigidBody","rawmultibodyjointset_forEachJointHandle","rawmultibodyjointset_jointAnchor1","rawmultibodyjointset_jointAnchor2","rawmultibodyjointset_jointContactsEnabled","rawmultibodyjointset_jointFrameX1","rawmultibodyjointset_jointFrameX2","rawmultibodyjointset_jointLimitsEnabled","rawmultibodyjointset_jointLimitsMax","rawmultibodyjointset_jointLimitsMin","rawmultibodyjointset_jointSetContactsEnabled","rawmultibodyjointset_jointType","rawmultibodyjointset_new","rawmultibodyjointset_remove","RawNarrowPhaseFinalization","__wbg_rawnarrowphase_free","contact_pair","rawnarrowphase_contact_pair","contact_pairs_with","rawnarrowphase_contact_pairs_with","addHeapObject","intersection_pair","rawnarrowphase_intersection_pair","intersection_pairs_with","rawnarrowphase_intersection_pairs_with","rawnarrowphase_new","RawPhysicsPipeline","RawPhysicsPipelineFinalization","__wbg_rawphysicspipeline_free","is_profiler_enabled","rawphysicspipeline_is_profiler_enabled","rawphysicspipeline_new","set_profiler_enabled","rawphysicspipeline_set_profiler_enabled","stepWithEvents","gravity","integrationParameters","broadPhase","narrowPhase","joints","articulations","ccd_solver","eventQueue","hookObject","hookFilterContactPair","hookFilterIntersectionPair","rawphysicspipeline_stepWithEvents","step","rawphysicspipeline_step","timing_broad_phase","rawphysicspipeline_timing_broad_phase","timing_ccd","rawphysicspipeline_timing_ccd","timing_ccd_broad_phase","rawphysicspipeline_timing_ccd_broad_phase","timing_ccd_narrow_phase","rawphysicspipeline_timing_ccd_narrow_phase","timing_ccd_solver","rawphysicspipeline_timing_ccd_solver","timing_ccd_toi_computation","rawphysicspipeline_timing_ccd_toi_computation","timing_collision_detection","rawphysicspipeline_timing_collision_detection","timing_island_construction","rawphysicspipeline_timing_island_construction","timing_narrow_phase","rawphysicspipeline_timing_narrow_phase","timing_solver","rawphysicspipeline_timing_solver","timing_step","rawphysicspipeline_timing_step","timing_user_changes","rawphysicspipeline_timing_user_changes","timing_velocity_assembly","rawphysicspipeline_timing_velocity_assembly","timing_velocity_resolution","rawphysicspipeline_timing_velocity_resolution","timing_velocity_update","rawphysicspipeline_timing_velocity_update","timing_velocity_writeback","rawphysicspipeline_timing_velocity_writeback","RawPidController","RawPidControllerFinalization","__wbg_rawpidcontroller_free","angular_correction","rb_handle","target_rotation","target_angvel","rawpidcontroller_angular_correction","apply_angular_correction","rawpidcontroller_apply_angular_correction","apply_linear_correction","target_translation","target_linvel","rawpidcontroller_apply_linear_correction","linear_correction","rawpidcontroller_linear_correction","kp","ki","kd","axes_mask","rawpidcontroller_new","reset_integrals","rawpidcontroller_reset_integrals","set_axes_mask","rawpidcontroller_set_axes_mask","set_kd","axes","rawpidcontroller_set_kd","set_ki","rawpidcontroller_set_ki","set_kp","rawpidcontroller_set_kp","RawPointColliderProjectionFinalization","__wbg_rawpointcolliderprojection_free","rawpointcolliderprojection_colliderHandle","featureId","rawpointcolliderprojection_featureId","featureType","rawpointcolliderprojection_featureType","isInside","rawpointcolliderprojection_isInside","rawpointcolliderprojection_point","RawPointProjectionFinalization","__wbg_rawpointprojection_free","rawpointprojection_isInside","rawpointprojection_point","RawRayColliderHitFinalization","__wbg_rawraycolliderhit_free","rawraycolliderhit_colliderHandle","timeOfImpact","rawraycolliderhit_timeOfImpact","RawRayColliderIntersectionFinalization","__wbg_rawraycolliderintersection_free","rawraycolliderintersection_colliderHandle","rawraycolliderintersection_featureId","rawraycolliderintersection_featureType","rawraycolliderintersection_normal","time_of_impact","rawraycolliderintersection_time_of_impact","RawRayIntersectionFinalization","__wbg_rawrayintersection_free","rawrayintersection_featureId","rawrayintersection_featureType","rawrayintersection_normal","rawrayintersection_time_of_impact","RawRigidBodySetFinalization","__wbg_rawrigidbodyset_free","rawrigidbodyset_contains","createRigidBody","gravityScale","massOnly","linvel","angvel","translationEnabledX","translationEnabledY","translationEnabledZ","rotationEnabledX","rotationEnabledY","rotationEnabledZ","linearDamping","angularDamping","rb_type","canSleep","sleeping","softCcdPrediction","ccdEnabled","dominanceGroup","additional_solver_iterations","additional_pgs_iterations","rawrigidbodyset_createRigidBody","forEachRigidBodyHandle","rawrigidbodyset_forEachRigidBodyHandle","rawrigidbodyset_len","rawrigidbodyset_new","propagateModifiedBodyPositionsToColliders","rawrigidbodyset_propagateModifiedBodyPositionsToColliders","rbAddForceAtPoint","force","rawrigidbodyset_rbAddForceAtPoint","rbAddForce","rawrigidbodyset_rbAddForce","rbAddTorque","torque","rawrigidbodyset_rbAddTorque","rbAdditionalPgsIterations","rawrigidbodyset_rbAdditionalPgsIterations","rbAdditionalSolverIterations","rawrigidbodyset_rbAdditionalSolverIterations","rbAngularDamping","rawrigidbodyset_rbAngularDamping","rbAngvel","rawrigidbodyset_rbAngvel","rbApplyImpulseAtPoint","impulse","rawrigidbodyset_rbApplyImpulseAtPoint","rbApplyImpulse","rawrigidbodyset_rbApplyImpulse","rbApplyTorqueImpulse","torque_impulse","rawrigidbodyset_rbApplyTorqueImpulse","rbBodyType","rawrigidbodyset_rbBodyType","rbCollider","at","rawrigidbodyset_rbCollider","rbDominanceGroup","rawrigidbodyset_rbDominanceGroup","rbEffectiveAngularInertia","rawrigidbodyset_rbEffectiveAngularInertia","rbEffectiveInvMass","rawrigidbodyset_rbEffectiveInvMass","rbEffectiveWorldInvInertia","rawrigidbodyset_rbEffectiveWorldInvInertia","rbEnableCcd","rawrigidbodyset_rbEnableCcd","rbGravityScale","rawrigidbodyset_rbGravityScale","rbInvMass","rawrigidbodyset_rbInvMass","rbInvPrincipalInertia","rawrigidbodyset_rbInvPrincipalInertia","rbIsCcdEnabled","rawrigidbodyset_rbIsCcdEnabled","rbIsDynamic","rawrigidbodyset_rbIsDynamic","rbIsEnabled","rawrigidbodyset_rbIsEnabled","rbIsFixed","rawrigidbodyset_rbIsFixed","rbIsKinematic","rawrigidbodyset_rbIsKinematic","rbIsMoving","rawrigidbodyset_rbIsMoving","rbIsSleeping","rawrigidbodyset_rbIsSleeping","rbIsSoftFrame","rawrigidbodyset_rbIsSoftFrame","rbLinearDamping","rawrigidbodyset_rbLinearDamping","rbLinvel","rawrigidbodyset_rbLinvel","rbLocalCom","rawrigidbodyset_rbLocalCom","rbLockRotations","locked","rawrigidbodyset_rbLockRotations","rbLockTranslations","rawrigidbodyset_rbLockTranslations","rbMass","rawrigidbodyset_rbMass","rbNextRotation","rawrigidbodyset_rbNextRotation","rbNextTranslation","rawrigidbodyset_rbNextTranslation","rbNumColliders","rawrigidbodyset_rbNumColliders","rbPrincipalInertiaLocalFrame","rawrigidbodyset_rbPrincipalInertiaLocalFrame","rbPrincipalInertia","rawrigidbodyset_rbPrincipalInertia","rbRecomputeMassPropertiesFromColliders","rawrigidbodyset_rbRecomputeMassPropertiesFromColliders","rbResetForces","rawrigidbodyset_rbResetForces","rbResetTorques","rawrigidbodyset_rbResetTorques","rbRotation","rawrigidbodyset_rbRotation","rbSetAdditionalMassProperties","rawrigidbodyset_rbSetAdditionalMassProperties","rbSetAdditionalMass","rawrigidbodyset_rbSetAdditionalMass","rbSetAdditionalPgsIterations","iters","rawrigidbodyset_rbSetAdditionalPgsIterations","rbSetAdditionalSolverIterations","rawrigidbodyset_rbSetAdditionalSolverIterations","rbSetAngularDamping","rawrigidbodyset_rbSetAngularDamping","rbSetAngvel","rawrigidbodyset_rbSetAngvel","rbSetBodyType","status","rawrigidbodyset_rbSetBodyType","rbSetDominanceGroup","group","rawrigidbodyset_rbSetDominanceGroup","rbSetEnabledRotations","allow_x","allow_y","allow_z","rawrigidbodyset_rbSetEnabledRotations","rbSetEnabledTranslations","rawrigidbodyset_rbSetEnabledTranslations","rbSetEnabled","rawrigidbodyset_rbSetEnabled","rbSetGravityScale","rawrigidbodyset_rbSetGravityScale","rbSetLinearDamping","rawrigidbodyset_rbSetLinearDamping","rbSetLinvel","rawrigidbodyset_rbSetLinvel","rbSetNextKinematicRotation","rawrigidbodyset_rbSetNextKinematicRotation","rbSetNextKinematicTranslation","rawrigidbodyset_rbSetNextKinematicTranslation","rbSetRotation","rawrigidbodyset_rbSetRotation","rbSetSoftCcdPrediction","rawrigidbodyset_rbSetSoftCcdPrediction","rbSetTranslation","rawrigidbodyset_rbSetTranslation","rbSetUserData","data","rawrigidbodyset_rbSetUserData","rbSleep","rawrigidbodyset_rbSleep","rbSoftBody","rawrigidbodyset_rbSoftBody","rbSoftCcdPrediction","rawrigidbodyset_rbSoftCcdPrediction","rbSoftCluster","rawrigidbodyset_rbSoftCluster","rbTranslation","rawrigidbodyset_rbTranslation","rbUserData","rawrigidbodyset_rbUserData","rbUserForce","rawrigidbodyset_rbUserForce","rbUserTorque","rawrigidbodyset_rbUserTorque","rbVelocityAtPoint","rawrigidbodyset_rbVelocityAtPoint","rbWakeUp","rawrigidbodyset_rbWakeUp","rbWorldCom","rawrigidbodyset_rbWorldCom","rawrigidbodyset_remove","Dynamic","KinematicPositionBased","KinematicVelocityBased","SoftFrame","RawRotationFinalization","__wbg_rawrotation_free","rawrotation_identity","rawrotation_new","rawrotation_w","rawrotation_x","rawrotation_y","rawrotation_z","RawSerializationPipeline","RawSerializationPipelineFinalization","__wbg_rawserializationpipeline_free","deserializeAll","rawserializationpipeline_deserializeAll","rawserializationpipeline_new","serializeAll","rawserializationpipeline_serializeAll","RawShapeFinalization","jsValue","__wbg_rawshape_free","rawshape_ball","halfHeight","rawshape_capsule","rawshape_castRayAndGetNormal","rawshape_castRay","shapePos1","shapeRot1","shapeVel1","shapeVel2","rawshape_castShape","compoundFlags","rawshape_compoundFlags","compoundLen","rawshape_compoundLen","compoundRotation","index","rawshape_compoundRotation","compoundShape","rawshape_compoundShape","compoundTranslation","rawshape_compoundTranslation","shapes","positions","rotations","flags","array","malloc","mem","setUint32","passArrayJsValueToWasm0","ptr1","len1","ptr2","len2","rawshape_compound","rawshape_cone","contactShape","rawshape_contactShape","containsPoint","rawshape_containsPoint","RawVHACDParameters","rawshape_convexDecompositionWithParams","rawshape_convexDecomposition","points","rawshape_convexHull","convexMeshData","rawshape_convexMeshData","rawshape_convexMesh","hx","hy","hz","rawshape_cuboid","rawshape_cylinder","halfExtents","rawshape_halfExtents","rawshape_halfHeight","halfspaceNormal","rawshape_halfspaceNormal","rawshape_halfspace","heightFieldFlags","rawshape_heightFieldFlags","heightfieldHeights","rawshape_heightfieldHeights","heightfieldNCols","rawshape_heightfieldNCols","heightfieldNRows","rawshape_heightfieldNRows","heightfieldScale","rawshape_heightfieldScale","nrows","ncols","heights","scale","rawshape_heightfield","rawshape_indices","intersectsRay","rawshape_intersectsRay","intersectsShape","rawshape_intersectsShape","polylineFlags","rawshape_polylineFlags","rawshape_polyline","rawshape_projectPoint","rawshape_radius","borderRadius","rawshape_roundCone","rawshape_roundConvexHull","rawshape_roundConvexMesh","rawshape_roundCuboid","rawshape_roundCylinder","roundRadius","rawshape_roundRadius","p1","p2","p3","rawshape_roundTriangle","rawshape_segment","shapeType","rawshape_shapeType","triMeshFlags","rawshape_triMeshFlags","rawshape_triangle","rawshape_trimesh","rawshape_vertices","voxelData","rawshape_voxelData","voxelSize","rawshape_voxelSize","voxel_size","rawshape_voxelsFromPoints","grid_coords","rawshape_voxels","RawShapeCastHitFinalization","__wbg_rawshapecasthit_free","rawshapecasthit_getComponents","RawShapeContactFinalization","__wbg_rawshapecontact_free","rawshapecontact_getComponents","RawShapeType","Ball","Cuboid","Capsule","Segment","Polyline","Triangle","TriMesh","HeightField","Compound","ConvexPolyhedron","Cylinder","Cone","RoundCuboid","RoundTriangle","RoundCylinder","RoundCone","RoundConvexPolyhedron","HalfSpace","Voxels","RawSoftBodyBuilder","RawSoftBodyBuilderFinalization","__wbg_rawsoftbodybuilder_free","addEdges","edges","rawsoftbodybuilder_addEdges","append","other","rawsoftbodybuilder_append","cellEdges","rawsoftbodybuilder_cellEdges","origin","du","dv","nu","nv","warp_frequency","warp_damping","weft_frequency","weft_damping","shear_frequency","shear_damping","rawsoftbodybuilder_clothAnisotropic","radius_start","radius_end","num_around","num_along","rawsoftbodybuilder_clothTube","rawsoftbodybuilder_cloth","center","half_extents","nx","ny","nz","rawsoftbodybuilder_cuboid","material","rawsoftbodybuilder_material","RawSoftBodyMaterial","rawsoftbodybuilder_new","numParticles","rawsoftbodybuilder_numParticles","particlePositions","rawsoftbodybuilder_particlePositions","start","end","num_particles","rawsoftbodybuilder_rope","setAdditionalPgsIterations","iterations","rawsoftbodybuilder_setAdditionalPgsIterations","setAdditionalSolverIterations","rawsoftbodybuilder_setAdditionalSolverIterations","setBendEdges","rawsoftbodybuilder_setBendEdges","setCanSleep","can_sleep","rawsoftbodybuilder_setCanSleep","setCellModel","rawsoftbodybuilder_setCellModel","setCells","cells","rawsoftbodybuilder_setCells","setDihedrals","dihedrals","rawsoftbodybuilder_setDihedrals","setDominanceGroup","rawsoftbodybuilder_setDominanceGroup","setEdgeSoftness","frequencies","dampings","rawsoftbodybuilder_setEdgeSoftness","setEdgeTearResistance","resistances","rawsoftbodybuilder_setEdgeTearResistance","setEdges","rawsoftbodybuilder_setEdges","setGravityScale","rawsoftbodybuilder_setGravityScale","setLinearDamping","rawsoftbodybuilder_setLinearDamping","setMass","rawsoftbodybuilder_setMass","setMasses","masses","rawsoftbodybuilder_setMasses","setMaterial","rawsoftbodybuilder_setMaterial","setNoSurfaceCollider","rawsoftbodybuilder_setNoSurfaceCollider","setOriented","oriented","rawsoftbodybuilder_setOriented","setParticleMass","rawsoftbodybuilder_setParticleMass","setParticleRadius","rawsoftbodybuilder_setParticleRadius","setPinnedParticles","pinned","rawsoftbodybuilder_setPinnedParticles","setPositions","rawsoftbodybuilder_setPositions","setSelfContacts","rawsoftbodybuilder_setSelfContacts","setShapeMatching","rawsoftbodybuilder_setShapeMatching","setSkinCollision","rawsoftbodybuilder_setSkinCollision","setSkin","rawsoftbodybuilder_setSkin","setSoftness","natural_frequency","damping_ratio","rawsoftbodybuilder_setSoftness","setSolver","solver","rawsoftbodybuilder_setSolver","setSurfaceCollider","rawsoftbodybuilder_setSurfaceCollider","setSurface","surface","rawsoftbodybuilder_setSurface","setTensionOnly","rawsoftbodybuilder_setTensionOnly","setVolumeFactor","rawsoftbodybuilder_setVolumeFactor","setVolumePreservation","rawsoftbodybuilder_setVolumePreservation","setWire","segments","rawsoftbodybuilder_setWire","subdivisions","rawsoftbodybuilder_sphere","surfaceDihedrals","rawsoftbodybuilder_surfaceDihedrals","surfaceEdges","rawsoftbodybuilder_surfaceEdges","translated","rawsoftbodybuilder_translated","rawsoftbodybuilder_trimesh","cell_size","skinned","rawsoftbodybuilder_volumetric","Volume","Corotational","NeoHookean","RawSoftBodyMaterialFinalization","__wbg_rawsoftbodymaterial_free","bendDampingRatio","rawsoftbodymaterial_bendDampingRatio","bendFrequency","rawsoftbodymaterial_bendFrequency","deformationDamping","rawsoftbodymaterial_deformationDamping","edgeDampingRatio","rawsoftbodymaterial_edgeDampingRatio","edgeFrequency","rawsoftbodymaterial_edgeFrequency","edgePlasticCreep","rawsoftbodymaterial_edgePlasticCreep","edgePlasticFlow","rawsoftbodymaterial_edgePlasticFlow","edgePlasticMax","rawsoftbodymaterial_edgePlasticMax","edgePlasticYield","rawsoftbodymaterial_edgePlasticYield","elasticDampingRatio","rawsoftbodymaterial_elasticDampingRatio","interiorStrength","rawsoftbodymaterial_interiorStrength","maxTearsPerStep","rawsoftbodymaterial_maxTearsPerStep","minPiece","rawsoftbodymaterial_minPiece","rawsoftbodymaterial_new","plasticCreep","rawsoftbodymaterial_plasticCreep","plasticMax","rawsoftbodymaterial_plasticMax","plasticYield","rawsoftbodymaterial_plasticYield","poissonRatio","rawsoftbodymaterial_poissonRatio","rawsoftbodymaterial_set_bendDampingRatio","rawsoftbodymaterial_set_bendFrequency","rawsoftbodymaterial_set_deformationDamping","rawsoftbodymaterial_set_edgeDampingRatio","rawsoftbodymaterial_set_edgeFrequency","rawsoftbodymaterial_set_edgePlasticCreep","rawsoftbodymaterial_set_edgePlasticFlow","rawsoftbodymaterial_set_edgePlasticMax","rawsoftbodymaterial_set_edgePlasticYield","rawsoftbodymaterial_set_elasticDampingRatio","rawsoftbodymaterial_set_interiorStrength","rawsoftbodymaterial_set_maxTearsPerStep","rawsoftbodymaterial_set_minPiece","rawsoftbodymaterial_set_plasticCreep","rawsoftbodymaterial_set_plasticMax","rawsoftbodymaterial_set_plasticYield","rawsoftbodymaterial_set_poissonRatio","shapeMatchingDampingRatio","rawsoftbodymaterial_set_shapeMatchingDampingRatio","shapeMatchingFrequency","rawsoftbodymaterial_set_shapeMatchingFrequency","tearForce","rawsoftbodymaterial_set_tearForce","tearSmoothing","rawsoftbodymaterial_set_tearSmoothing","tearStrain","rawsoftbodymaterial_set_tearStrain","volumeDampingRatio","rawsoftbodymaterial_set_volumeDampingRatio","volumeFrequency","rawsoftbodymaterial_set_volumeFrequency","youngModulus","rawsoftbodymaterial_set_youngModulus","rawsoftbodymaterial_shapeMatchingDampingRatio","rawsoftbodymaterial_shapeMatchingFrequency","rawsoftbodymaterial_tearForce","rawsoftbodymaterial_tearSmoothing","rawsoftbodymaterial_tearStrain","tears","rawsoftbodymaterial_tears","rawsoftbodymaterial_uniform","rawsoftbodymaterial_volumeDampingRatio","rawsoftbodymaterial_volumeFrequency","rawsoftbodymaterial_youngModulus","RawSoftBodySetFinalization","__wbg_rawsoftbodyset_free","addCluster","particles","rawsoftbodyset_addCluster","rawsoftbodyset_contains","cut","blade","rawsoftbodyset_cut","RawSoftBodyTearEvent","forEachSoftBodyHandle","rawsoftbodyset_forEachSoftBodyHandle","insert","builder","rawsoftbodyset_insert","rawsoftbodyset_len","rawsoftbodyset_new","removeCluster","cluster","rawsoftbodyset_removeCluster","rawsoftbodyset_remove","sbAddForce","rawsoftbodyset_sbAddForce","sbAddParticleForce","rawsoftbodyset_sbAddParticleForce","sbApplyImpulseAtPoint","falloff_radius","rawsoftbodyset_sbApplyImpulseAtPoint","sbApplyImpulse","rawsoftbodyset_sbApplyImpulse","sbApplyParticleImpulse","rawsoftbodyset_sbApplyParticleImpulse","sbApplyRadialImpulse","magnitude","rawsoftbodyset_sbApplyRadialImpulse","sbAttachParticle","rawsoftbodyset_sbAttachParticle","sbAttachmentBody","rawsoftbodyset_sbAttachmentBody","sbAttachmentParticle","rawsoftbodyset_sbAttachmentParticle","sbBoundary","rawsoftbodyset_sbBoundary","sbCellModel","rawsoftbodyset_sbCellModel","sbCellRestVolume","rawsoftbodyset_sbCellRestVolume","sbCellStiffnessScale","rawsoftbodyset_sbCellStiffnessScale","sbCellStress","rawsoftbodyset_sbCellStress","sbCellTearResistance","rawsoftbodyset_sbCellTearResistance","sbCells","rawsoftbodyset_sbCells","sbCenterOfMass","rawsoftbodyset_sbCenterOfMass","sbClusterParticles","rawsoftbodyset_sbClusterParticles","sbClusterProxy","rawsoftbodyset_sbClusterProxy","sbClusterShapeMatchingEnabled","rawsoftbodyset_sbClusterShapeMatchingEnabled","sbDetachParticle","rawsoftbodyset_sbDetachParticle","sbDihedralRestAngle","rawsoftbodyset_sbDihedralRestAngle","sbDihedrals","rawsoftbodyset_sbDihedrals","sbEdgeImpulse","rawsoftbodyset_sbEdgeImpulse","sbEdgeIsBend","rawsoftbodyset_sbEdgeIsBend","sbEdgePlasticStrain","rawsoftbodyset_sbEdgePlasticStrain","sbEdgeRestLength","rawsoftbodyset_sbEdgeRestLength","sbEdgeStress","rawsoftbodyset_sbEdgeStress","sbEdgeTearResistance","rawsoftbodyset_sbEdgeTearResistance","sbEdges","rawsoftbodyset_sbEdges","sbEnableClusterShapeMatching","rawsoftbodyset_sbEnableClusterShapeMatching","sbEnableVolumePreservation","rawsoftbodyset_sbEnableVolumePreservation","sbGravityScale","rawsoftbodyset_sbGravityScale","sbHasPendingTears","rawsoftbodyset_sbHasPendingTears","sbIsClusterLive","rawsoftbodyset_sbIsClusterLive","sbIsEnabled","rawsoftbodyset_sbIsEnabled","sbIsParticleDamaged","rawsoftbodyset_sbIsParticleDamaged","sbIsParticleOnSurface","rawsoftbodyset_sbIsParticleOnSurface","sbIsParticlePinned","rawsoftbodyset_sbIsParticlePinned","sbIsSleeping","rawsoftbodyset_sbIsSleeping","sbLinearDamping","rawsoftbodyset_sbLinearDamping","sbMass","rawsoftbodyset_sbMass","sbMaterial","rawsoftbodyset_sbMaterial","sbMeshCluster","rawsoftbodyset_sbMeshCluster","sbMeshCollider","rawsoftbodyset_sbMeshCollider","sbMeshCollisionEnabled","rawsoftbodyset_sbMeshCollisionEnabled","sbMeshIndices","rawsoftbodyset_sbMeshIndices","sbMeshIsOriented","rawsoftbodyset_sbMeshIsOriented","sbMeshIsSkinned","rawsoftbodyset_sbMeshIsSkinned","sbMeshOfCollider","collider","rawsoftbodyset_sbMeshOfCollider","sbMeshVertices","rawsoftbodyset_sbMeshVertices","sbNumAttachments","rawsoftbodyset_sbNumAttachments","sbNumCells","rawsoftbodyset_sbNumCells","sbNumClusters","rawsoftbodyset_sbNumClusters","sbNumDihedrals","rawsoftbodyset_sbNumDihedrals","sbNumEdges","rawsoftbodyset_sbNumEdges","sbNumMeshes","rawsoftbodyset_sbNumMeshes","sbNumParticles","rawsoftbodyset_sbNumParticles","sbOrigin","rawsoftbodyset_sbOrigin","sbParticleMass","rawsoftbodyset_sbParticleMass","sbParticlePosition","rawsoftbodyset_sbParticlePosition","sbParticlePositions","rawsoftbodyset_sbParticlePositions","sbParticleRadius","rawsoftbodyset_sbParticleRadius","sbParticleRestPosition","rawsoftbodyset_sbParticleRestPosition","sbParticleVelocities","rawsoftbodyset_sbParticleVelocities","sbParticleVelocity","rawsoftbodyset_sbParticleVelocity","sbPieces","rawsoftbodyset_sbPieces","cachedFloat64ArrayMemory0","byteLength","Float64Array","memory","buffer","getFloat64ArrayMemory0","subarray","getArrayF64FromWasm0","sbResetForces","rawsoftbodyset_sbResetForces","sbResetPlasticity","rawsoftbodyset_sbResetPlasticity","sbRestVolume","rawsoftbodyset_sbRestVolume","sbRootBody","rawsoftbodyset_sbRootBody","sbSetAdditionalPgsIterations","rawsoftbodyset_sbSetAdditionalPgsIterations","sbSetClusterEdgeSoftness","rawsoftbodyset_sbSetClusterEdgeSoftness","sbSetClusterKinematicTarget","rawsoftbodyset_sbSetClusterKinematicTarget","sbSetClusterPinned","rawsoftbodyset_sbSetClusterPinned","sbSetClusterStiffnessScale","rawsoftbodyset_sbSetClusterStiffnessScale","sbSetClusterTearResistance","resistance","rawsoftbodyset_sbSetClusterTearResistance","sbSetEnabled","rawsoftbodyset_sbSetEnabled","sbSetMaterial","rawsoftbodyset_sbSetMaterial","sbSetParticleKinematicTarget","position","rawsoftbodyset_sbSetParticleKinematicTarget","sbSetParticlePinned","rawsoftbodyset_sbSetParticlePinned","sbSetParticlePosition","rawsoftbodyset_sbSetParticlePosition","sbSetParticleVelocity","velocity","rawsoftbodyset_sbSetParticleVelocity","sbSetSolver","rawsoftbodyset_sbSetSolver","sbSetUserData","rawsoftbodyset_sbSetUserData","sbSetVolumeFactor","rawsoftbodyset_sbSetVolumeFactor","sbSolver","rawsoftbodyset_sbSolver","sbTearCell","rawsoftbodyset_sbTearCell","sbTearEdge","rawsoftbodyset_sbTearEdge","sbTopologyVersion","rawsoftbodyset_sbTopologyVersion","sbUserData","rawsoftbodyset_sbUserData","sbVolumeFactor","rawsoftbodyset_sbVolumeFactor","sbVolumePreservationEnabled","rawsoftbodyset_sbVolumePreservationEnabled","sbVolume","rawsoftbodyset_sbVolume","sbWakeUp","rawsoftbodyset_sbWakeUp","tear","rawsoftbodyset_tear","strong","rawsoftbodyset_wakeUp","Constraints","Fem","RawSoftBodyTearEventFinalization","__wbg_rawsoftbodytearevent_free","clusterSplitCluster","rawsoftbodytearevent_clusterSplitCluster","clusterSplitKeepsProxy","rawsoftbodytearevent_clusterSplitKeepsProxy","clusterSplitProxy","rawsoftbodytearevent_clusterSplitProxy","clusterSplitSoftBody","rawsoftbodytearevent_clusterSplitSoftBody","clusterSplitSource","rawsoftbodytearevent_clusterSplitSource","insertedParticles","rawsoftbodytearevent_insertedParticles","movedJointFrom","rawsoftbodytearevent_movedJointFrom","movedJointTo","rawsoftbodytearevent_movedJointTo","movedJoint","rawsoftbodytearevent_movedJoint","numClusterSplits","rawsoftbodytearevent_numClusterSplits","numMovedJoints","rawsoftbodytearevent_numMovedJoints","numPieces","rawsoftbodytearevent_numPieces","particleDestinationBody","particle","rawsoftbodytearevent_particleDestinationBody","particleDestinationIndex","rawsoftbodytearevent_particleDestinationIndex","pieceClusters","rawsoftbodytearevent_pieceClusters","pieceParticles","rawsoftbodytearevent_pieceParticles","pieceSoftBody","rawsoftbodytearevent_pieceSoftBody","removedEdges","rawsoftbodytearevent_removedEdges","seeds","rawsoftbodytearevent_seeds","softBody","rawsoftbodytearevent_softBody","splitParticles","rawsoftbodytearevent_splitParticles","tornCells","rawsoftbodytearevent_tornCells","tornEdges","rawsoftbodytearevent_tornEdges","Both","Compression","Tension","Direct","DirectByPosition","Skinned","Keep","StandDown","AlongNormal","RawSoftRecoverySettingsFinalization","__wbg_rawsoftrecoverysettings_free","authoredVelocityMargin","rawsoftrecoverysettings_authoredVelocityMargin","crossBodyDetection","rawsoftrecoverysettings_crossBodyDetection","crossBodyExpelGate","rawsoftrecoverysettings_crossBodyExpelGate","crossingRepulsionGuide","rawsoftrecoverysettings_crossingRepulsionGuide","crossingRepulsionSelfGuide","rawsoftrecoverysettings_crossingRepulsionSelfGuide","crossingRepulsion","rawsoftrecoverysettings_crossingRepulsion","detectionMotionGating","rawsoftrecoverysettings_detectionMotionGating","edgeSpeculation","rawsoftrecoverysettings_edgeSpeculation","edgeStandDown","rawsoftrecoverysettings_edgeStandDown","invertedCellDetection","rawsoftrecoverysettings_invertedCellDetection","rawsoftrecoverysettings_new","overlapConstraintPace","rawsoftrecoverysettings_overlapConstraintPace","overlapConstraints","rawsoftrecoverysettings_overlapConstraints","overlapEdgeStandDown","rawsoftrecoverysettings_overlapEdgeStandDown","overlapKeptDepth","rawsoftrecoverysettings_overlapKeptDepth","overlapMultiVolume","rawsoftrecoverysettings_overlapMultiVolume","overlapNormalPush","rawsoftrecoverysettings_overlapNormalPush","overlapPatchConstraints","rawsoftrecoverysettings_overlapPatchConstraints","overlapPatience","rawsoftrecoverysettings_overlapPatience","overlapProgressMargin","rawsoftrecoverysettings_overlapProgressMargin","overlapRigid","rawsoftrecoverysettings_overlapRigid","overlapSelfRegions","rawsoftrecoverysettings_overlapSelfRegions","overlapSkinVolume","rawsoftrecoverysettings_overlapSkinVolume","overlapSkipSelfTangled","rawsoftrecoverysettings_overlapSkipSelfTangled","overlapSplit","rawsoftrecoverysettings_overlapSplit","recoveryPace","rawsoftrecoverysettings_recoveryPace","selfCrossingDetection","rawsoftrecoverysettings_selfCrossingDetection","selfStandDown","rawsoftrecoverysettings_selfStandDown","rawsoftrecoverysettings_set_authoredVelocityMargin","rawsoftrecoverysettings_set_crossBodyDetection","rawsoftrecoverysettings_set_crossBodyExpelGate","rawsoftrecoverysettings_set_crossingRepulsionGuide","rawsoftrecoverysettings_set_crossingRepulsionSelfGuide","rawsoftrecoverysettings_set_crossingRepulsion","rawsoftrecoverysettings_set_detectionMotionGating","rawsoftrecoverysettings_set_edgeSpeculation","rawsoftrecoverysettings_set_edgeStandDown","rawsoftrecoverysettings_set_invertedCellDetection","rawsoftrecoverysettings_set_overlapConstraintPace","rawsoftrecoverysettings_set_overlapConstraints","rawsoftrecoverysettings_set_overlapEdgeStandDown","rawsoftrecoverysettings_set_overlapKeptDepth","rawsoftrecoverysettings_set_overlapMultiVolume","rawsoftrecoverysettings_set_overlapNormalPush","rawsoftrecoverysettings_set_overlapPatchConstraints","rawsoftrecoverysettings_set_overlapPatience","rawsoftrecoverysettings_set_overlapProgressMargin","rawsoftrecoverysettings_set_overlapRigid","rawsoftrecoverysettings_set_overlapSelfRegions","rawsoftrecoverysettings_set_overlapSkinVolume","rawsoftrecoverysettings_set_overlapSkipSelfTangled","rawsoftrecoverysettings_set_overlapSplit","rawsoftrecoverysettings_set_recoveryPace","rawsoftrecoverysettings_set_selfCrossingDetection","rawsoftrecoverysettings_set_selfStandDown","RawVHACDParametersFinalization","__wbg_rawvhacdparameters_free","alpha","rawvhacdparameters_alpha","beta","rawvhacdparameters_beta","concavity","rawvhacdparameters_concavity","convex_hull_approximation","rawvhacdparameters_convex_hull_approximation","convex_hull_downsampling","rawvhacdparameters_convex_hull_downsampling","max_convex_hulls","rawvhacdparameters_max_convex_hulls","rawvhacdparameters_new","plane_downsampling","rawvhacdparameters_plane_downsampling","resolution","rawvhacdparameters_resolution","val","rawvhacdparameters_set_alpha","rawvhacdparameters_set_beta","rawvhacdparameters_set_concavity","rawvhacdparameters_set_convex_hull_approximation","rawvhacdparameters_set_convex_hull_downsampling","rawvhacdparameters_set_max_convex_hulls","rawvhacdparameters_set_plane_downsampling","rawvhacdparameters_set_resolution","RawVectorFinalization","__wbg_rawvector_free","rawvector_new","rawvector_set_x","rawvector_set_y","rawvector_set_z","rawvector_x","xyz","rawvector_xyz","xzy","rawvector_xzy","rawvector_y","yxz","rawvector_yxz","yzx","rawvector_yzx","rawvector_z","rawvector_zero","zxy","rawvector_zxy","zyx","rawvector_zyx","FinalizationRegistry","__wbg_rawsdpmatrix3_free","heap_next","push","idx","instance","klass","Error","name","getFloat32ArrayMemory0","cachedInt32ArrayMemory0","Int32Array","getInt32ArrayMemory0","getUint32ArrayMemory0","getArrayU8FromWasm0","getUint8ArrayMemory0","cachedDataViewMemory0","detached","DataView","cachedFloat32ArrayMemory0","Float32Array","getStringFromWasm0","numBytesDecoded","cachedTextDecoder","TextDecoder","ignoreBOM","fatal","decode","decodeText","cachedUint32ArrayMemory0","Uint32Array","cachedUint8ArrayMemory0","Uint8Array","getObject","handleError","args","apply","e","__wbindgen_export","Array","fill","arg","set","dropObject","async","__wbg_init","module_or_path","getPrototypeOf","console","warn","URL","imports","import0","__proto__","__wbg___wbindgen_boolean_get_5b446f51afd21013","v","__wbg___wbindgen_is_function_1f9d30630b8b1d3d","__wbg___wbindgen_is_undefined_8865fb403f8fe9d8","__wbg___wbindgen_number_get_2e0e7dee9f701a71","arg1","setFloat64","setInt32","__wbg___wbindgen_throw_41e9ee4f547fc59a","__wbg_bind_e7f12e49a3040c89","arg2","arg3","bind","__wbg_call_1875a20c43a36133","call","arguments","__wbg_call_187d372bd5fdd4aa","__wbg_call_939a2607c4484b0b","arg4","__wbg_length_58572db4c38f3c3e","__wbg_length_7f3c00c40364105e","__wbg_new_from_slice_9a868026ffa4208a","__wbg_new_with_length_cc0362bfe8499e5a","__wbg_now_e7c6795a7f81e10f","now","__wbg_performance_3fcf6e32a7e1ed0a","performance","__wbg_prototypesetcall_bc27214492979395","__wbg_rawcontactforceevent_new","__wbg_rawraycolliderintersection_new","__wbg_rawshape_unwrap","__unwrap","__wbg_rawsoftbodytearevent_new","__wbg_set_070bd465f1c195a4","__wbg_set_index_3a9fd81ba7ece0c0","__wbg_static_accessor_GLOBAL_266715b9d96ba635","global","__wbg_static_accessor_GLOBAL_THIS_10fb7dc1ae063179","globalThis","__wbg_static_accessor_SELF_0b583911f537483a","self","__wbg_static_accessor_WINDOW_d7f903d1508cbdc4","window","__wbindgen_generic_0000000000000001","__wbindgen_object_clone_ref","__wbindgen_object_drop_ref","__wbg_get_imports","Request","fetch","module","Response","ok","statusText","url","WebAssembly","instantiateStreaming","type","expectedResponseType","headers","get","bytes","arrayBuffer","instantiate","Instance","__wbg_load","exports","__wbg_finalize_init","scratchBuffer","Vector3","VectorOps","new","target","zeros","raw","res","out","input","Quaternion","RotationOps","identity","SdpMatrix3","elements","m11","m12","m21","m13","m31","m22","m23","m32","m33","SdpMatrix3Ops","sdpMatrix3","RigidBodyType","FeatureType","ShapeType","HeightFieldFlags","PolylineFlags","CompoundFlags","TriMeshFlags","PidAxesMask","ActiveEvents","ActiveHooks","SolverFlags","QueryFilterFlags","ActiveCollisionTypes","MassPropsMode","SoftBodyCellModel","SoftEdgePlasticFlow","SoftBodySolver","SoftPatchConstraints","SoftMeshBindingMode","JointType","MotorModel","JointAxis","JointAxesMask","CoefficientCombineRule","RigidBody","rawSet","colliderSet","finalizeDeserialization","isValid","lockTranslations","lockRotations","setEnabledTranslations","enableX","enableY","enableZ","restrictTranslations","setEnabledRotations","restrictRotations","additionalSolverIterations","additionalPgsIterations","isSoftFrame","softCluster","enableCcd","setSoftCcdPrediction","fromBuffer","nextTranslation","nextRotation","setTranslation","tra","setLinvel","vel","rawVel","intoRaw","setRotation","setAngvel","setNextKinematicTranslation","t","setNextKinematicRotation","velocityAtPoint","rawPoint","effectiveInvMass","invMass","localCom","worldCom","invPrincipalInertia","principalInertia","principalInertiaLocalFrame","effectiveWorldInvInertia","effectiveAngularInertia","sleep","isCcdEnabled","numColliders","setEnabled","isEnabled","bodyType","setBodyType","isSleeping","isMoving","isFixed","isKinematic","isDynamic","recomputeMassPropertiesFromColliders","setAdditionalMass","setAdditionalMassProperties","angularInertiaLocalFrame","rawCom","rawPrincipalInertia","rawInertiaFrame","setAngularDamping","resetForces","resetTorques","addForce","rawForce","applyImpulse","rawImpulse","addTorque","rawTorque","applyTorqueImpulse","torqueImpulse","rawTorqueImpulse","addForceAtPoint","applyImpulseAtPoint","userForce","userTorque","RigidBodyDesc","translationsEnabledX","translationsEnabledY","translationsEnabledZ","rotationsEnabledX","rotationsEnabledY","rotationsEnabledZ","TypeError","copy","enabledTranslations","enabledRotations","can","setSleeping","setCcdEnabled","setUserData","userData","Coarena","fconv","uconv","size","delete","forEach","elt","getAll","filter","RigidBodySet","map","rb","desc","rawTra","rawRot","rawLv","rawAv","impulseJoints","multibodyJoints","unmap","forEachJointHandleAttachedToRigidBody","unmapRemovedColliders","mapNewBodies","unmapRemovedBodies","forEachActiveRigidBody","Ray","dir","pointAt","RayIntersection","RayColliderIntersection","RayColliderHit","result","PointProjection","PointColliderProjection","ShapeCastHit","witness1","witness2","normal1","normal2","ColliderShapeCastHit","super","BroadPhase","ray","filterFlags","filterGroups","filterExcludeCollider","filterExcludeRigidBody","filterPredicate","rawOrig","rawDir","fromRaw","rawInter","rawPos","rawShape","targetDistance","stopAtPenetration","rawColliderShapeCastHit","rawCenter","rawHalfExtents","NarrowPhase","tempManifold","TempContactManifold","contactPairsWith","intersectionPairsWith","contactPair","rawPair","flipped","intersectionPair","localNormal1","localNormal2","numContacts","localContactPoint1","localContactPoint2","contactDist","contactFid1","contactFid2","contactImpulse","contactTangentImpulseX","contactTangentImpulseY","numSolverContacts","solverContactPoint","solverContactDist","solverContactTangentVelocity","ShapeContact","dist","point1","point2","Shape","rawType","fromRawShape","vs","vox_data","vox_size","tri_flags","hf_flags","Heightfield","extents","mesh","rawPos1","rawRot1","rawVel1","rawPos2","rawRot2","rawVel2","rawShape1","rawShape2","rawShapeCastHit","rawRayOrig","rawRayDir","ball","n","halfspace","cuboid","roundCuboid","capsule","a","b","ra","segment","c","rc","triangle","roundTriangle","polyline","voxels","voxelsFromPoints","some","numShapes","rawShapes","s","pos","compound","trimesh","convexMesh","convexHull","roundConvexMesh","roundConvexHull","rawScale","heightfield","cylinder","roundCylinder","cone","roundCone","PhysicsPipeline","ccdSolver","rawG","filterContactPair","filterIntersectionPair","SerializationPipeline","rawGra","World","DebugRenderBuffers","DebugRenderPipeline","castClosure","CharacterCollision","KinematicCharacterController","rawCharacterCollision","_applyImpulsesToDynamicBodies","_characterMass","rawVect","applyImpulsesToDynamicBodies","setApplyImpulsesToDynamicBodies","characterMass","setCharacterMass","desiredTranslationDelta","rawTranslationDelta","PidController","setKp","setKi","setKd","setAxes","resetIntegrals","applyLinearCorrection","targetPosition","targetLinvel","applyAngularCorrection","targetRotation","targetAngVel","linearCorrection","angularCorrection","DynamicRayCastVehicleController","_chassis","updateVehicle","currentVehicleSpeed","indexUpAxis","indexForwardAxis","setIndexForwardAxis","addWheel","chassisConnectionCs","directionCs","axleCs","suspensionRestLength","rawChassisConnectionCs","rawDirectionCs","rawAxleCs","numWheels","wheelChassisConnectionPointCs","setWheelChassisConnectionPointCs","rawValue","wheelSuspensionRestLength","setWheelSuspensionRestLength","wheelMaxSuspensionTravel","setWheelMaxSuspensionTravel","wheelRadius","setWheelRadius","wheelSuspensionStiffness","setWheelSuspensionStiffness","wheelSuspensionCompression","setWheelSuspensionCompression","wheelSuspensionRelaxation","setWheelSuspensionRelaxation","wheelMaxSuspensionForce","setWheelMaxSuspensionForce","wheelBrake","setWheelBrake","wheelSteering","setWheelSteering","wheelEngineForce","setWheelEngineForce","wheelDirectionCs","setWheelDirectionCs","wheelAxleCs","setWheelAxleCs","wheelFrictionSlip","setWheelFrictionSlip","wheelSideFrictionStiffness","setWheelSideFrictionStiffness","wheelRotation","wheelForwardImpulse","wheelSideImpulse","wheelSuspensionForce","wheelContactNormal","wheelContactPoint","wheelSuspensionLength","wheelHardPoint","wheelIsInContact","wheelGroundObject","rawIntegrationParameters","rawIslands","rawBroadPhase","rawNarrowPhase","rawBodies","rawColliders","rawSoftBodies","rawImpulseJoints","rawMultibodyJoints","rawCCDSolver","rawPhysicsPipeline","rawSerializationPipeline","rawDebugRenderPipeline","IntegrationParameters","IslandManager","ColliderSet","ImpulseJointSet","MultibodyJointSet","SoftBodySet","CCDSolver","physicsPipeline","serializationPipeline","debugRenderPipeline","characterControllers","Set","pidControllers","vehicleControllers","controller","takeSnapshot","debugRender","mapNewSoftBodies","mapNewColliders","unmapRemovedJoints","timestep","unitsPerMeter","niter","substeps","createCharacterController","add","removeCharacterController","createPidController","removePidController","createVehicleController","removeVehicleController","parentHandle","createSoftBody","binding","addSoftBodyCluster","removeSoftBodyCluster","tearSoftBody","cutSoftBody","wakeUpSoftBody","createImpulseJoint","createMultibodyJoint","getRigidBody","getCollider","getImpulseJoint","getMultibodyJoint","getSoftBody","removeRigidBody","removeSoftBody","removeCollider","removeImpulseJoint","joint","removeMultibodyJoint","forEachCollider","forEachRigidBody","forEachSoftBody","profilerEnabled","timingStep","timingCollisionDetection","timingBroadPhase","timingNarrowPhase","timingSolver","timingVelocityAssembly","timingVelocityResolution","timingVelocityUpdate","timingVelocityWriteback","timingCcd","timingCcdToiComputation","timingCcdBroadPhase","timingCcdNarrowPhase","timingCcdSolver","timingIslandConstruction","timingUserChanges","TempContactForceEvent","totalForce","totalForceMagnitude","maxForceDirection","maxForceMagnitude","EventQueue","event","SoftBodyTearEvent","Collider","_parent","_shape","ensureShapeIsCached","clearShapeCache","translationWrtParent","rotationWrtParent","setSensor","setShape","setRestitution","setFriction","setFrictionCombineRule","setRestitutionCombineRule","setCollisionGroups","setSolverGroups","setContactSkin","thickness","setActiveHooks","setActiveEvents","setContactForceEventThreshold","setActiveCollisionTypes","setDensity","setMassProperties","setTranslationWrtParent","setRotationWrtParent","setHalfExtents","setRadius","setRoundRadius","setHalfHeight","setVoxel","propagateVoxelChange","voxels2","combineVoxelStates","isDeformable","volume","rawCollider1Vel","rawShape2Pos","rawShape2Rot","rawShape2Vel","castCollider","rawCollider2Vel","contactCollider","ColliderDesc","Density","Average","DEFAULT","NONE","rawFlags","rawParams","planeDownsampling","convexHullDownsampling","maxConvexHulls","convexHullApproximation","convexDecompositionWithParams","convexDecomposition","sensor","Mass","MassProps","isNaN","rawMode","eps","selfContacts","SoftRecoverySettings","copyFromRaw","freeRaw","SoftMeshBinding","mode","from","SoftBodyMaterial","naturalFrequency","dampingRatio","uniform","edgeSoftness","bendSoftness","volumeSoftness","shapeMatchingSoftness","_a","_b","_c","SoftBody","topologyVersion","particlePosition","particleVelocity","particleVelocities","particleRestPosition","particleMass","isParticlePinned","isParticleOnSurface","isParticleDamaged","setParticlePosition","setParticleVelocity","setParticleKinematicTarget","setParticlePinned","attachParticle","detachParticle","numAttachments","attachmentParticle","attachmentBody","numEdges","edgeRestLength","isEdgeBend","edgeImpulse","edgeStress","edgePlasticStrain","edgeTearResistance","numCells","cellRestVolume","cellStress","cellStiffnessScale","cellTearResistance","numDihedrals","dihedralRestAngle","boundary","cellModel","volumePreservationEnabled","enableVolumePreservation","restVolume","volumeFactor","particleRadius","resetPlasticity","rootBody","pieces","addParticleForce","applyParticleImpulse","falloffRadius","applyRadialImpulse","tearEdge","tearCell","hasPendingTears","numClusters","isClusterLive","clusterProxy","proxy","clusterParticles","clusterShapeMatchingEnabled","enableClusterShapeMatching","setClusterStiffnessScale","setClusterEdgeSoftness","softness","setClusterTearResistance","setClusterPinned","setClusterKinematicTarget","numMeshes","meshCluster","meshCollider","isMeshSkinned","meshCollisionEnabled","isMeshOriented","meshVertices","meshIndices","meshOfCollider","SoftBodyDesc","flat","generator","setters","pinnedParticles","volumePreservation","shapeMatching","surfaceCollider","skinCollision","probe","withGenerator","rawStart","rawEnd","rope","cellSize","volumetric","rawOrigin","rawDu","rawDv","cloth","radiusStart","radiusEnd","numAround","numAlong","rawAxis","clothTube","warp","weft","shear","clothAnisotropic","rawHalf","sphere","flatVertices","flatIndices","flatEdges","flatResistances","rawOther","setter","rawMaterial","particleDestination","ImpulseJoint","bodySet","RevoluteImpulseJoint","PrismaticImpulseJoint","FixedImpulseJoint","SpringImpulseJoint","RopeImpulseJoint","SphericalImpulseJoint","GenericImpulseJoint","body1","body2","frameX1","frameX2","setAnchor1","setAnchor2","setFrameX1","setFrameX2","setLocalFrame1","rawAnchor","setLocalFrame2","setContactsEnabled","contactsEnabled","UnitImpulseJoint","setLimits","configureMotorModel","setMotorMaxForce","configureMotorVelocity","configureMotorPosition","configureMotor","JointData","frame1","frame2","axesMask","rawAx","rawA1","rawA2","rawFra1","rawFra2","fixed","spring","limits","prismatic","rawAxesMask","generic","spherical","rawAx1","rawAx2","revoluteWithAxes","revolute","newTyped","MultibodyJoint","RevoluteMultibodyJoint","PrismaticMultibodyJoint","FixedMultibodyJoint","SphericalMultibodyJoint","UnitMultibodyJoint","sb","rawBuilder","removed","finishTopologyChange","__awaiter","thisArg","_arguments","P","Promise","resolve","reject","fulfilled","next","rejected","done","then","base64Js","b64","lens","getLens","validLen","placeHoldersLen","tmp","arr","Arr","_byteLength","curByte","revLookup","charCodeAt","uint8","extraBytes","parts","maxChunkLength","encodeChunk","lookup","join","code","indexOf","num","output","init","wasmInit","base64","toByteArray","version","deferred1_0","deferred1_1","vers","reserveMemory","extraBytesCount","extra_bytes_count","reserve_memory"],"mappings":"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"}