# {py:mod}`simvx.core.physics.pymunk_backend` ```{py:module} simvx.core.physics.pymunk_backend ``` ```{autodoc2-docstring} simvx.core.physics.pymunk_backend :allowtitles: ``` ## Module Contents ### Classes ````{list-table} :class: autosummary longtable :align: left * - {py:obj}`PymunkPhysics2D ` - ```{autodoc2-docstring} simvx.core.physics.pymunk_backend.PymunkPhysics2D :summary: ``` ```` ### Functions ````{list-table} :class: autosummary longtable :align: left * - {py:obj}`register ` - ```{autodoc2-docstring} simvx.core.physics.pymunk_backend.register :summary: ``` ```` ### Data ````{list-table} :class: autosummary longtable :align: left * - {py:obj}`__all__ ` - ```{autodoc2-docstring} simvx.core.physics.pymunk_backend.__all__ :summary: ``` ```` ### API `````{py:class} PymunkPhysics2D(*, gravity: simvx.core.math.Vec2 | None = None) :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D Bases: {py:obj}`simvx.core.physics.world2d.Physics2DWorld` ```{autodoc2-docstring} simvx.core.physics.pymunk_backend.PymunkPhysics2D ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.core.physics.pymunk_backend.PymunkPhysics2D.__init__ ``` ````{py:property} body_count :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.body_count :type: int ```` ````{py:method} clear() -> None :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.clear ```{autodoc2-docstring} simvx.core.physics.pymunk_backend.PymunkPhysics2D.clear ``` ```` ````{py:method} create_circle(radius: float) -> simvx.core.physics.world2d.ShapeHandle :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.create_circle ```` ````{py:method} create_box(half_extents: simvx.core.math.Vec2) -> simvx.core.physics.world2d.ShapeHandle :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.create_box ```` ````{py:method} create_capsule(radius: float, height: float) -> simvx.core.physics.world2d.ShapeHandle :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.create_capsule ```` ````{py:method} create_segment(a: simvx.core.math.Vec2, b: simvx.core.math.Vec2, radius: float = 0.0) -> simvx.core.physics.world2d.ShapeHandle :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.create_segment ```` ````{py:method} create_convex_polygon(points: numpy.ndarray) -> simvx.core.physics.world2d.ShapeHandle :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.create_convex_polygon ```` ````{py:method} create_concave_polygon(segments: numpy.ndarray) -> simvx.core.physics.world2d.ShapeHandle :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.create_concave_polygon ```` ````{py:method} create_body(shape: simvx.core.physics.world2d.ShapeHandle, body_type: simvx.core.physics.world.BodyMode, transform: object, *, mass: float = 1.0, collision_layer: int = 1, collision_mask: int = 4294967295, is_sensor: bool = False, friction: float = 0.5, restitution: float = 0.0, friction_combine: simvx.core.physics.material.CombineMode = CombineMode.AVERAGE, restitution_combine: simvx.core.physics.material.CombineMode = CombineMode.AVERAGE, continuous: bool = False) -> simvx.core.physics.world2d.BodyHandle :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.create_body ```` ````{py:method} destroy_body(handle: simvx.core.physics.world2d.BodyHandle) -> None :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.destroy_body ```` ````{py:method} set_body_transform(handle: simvx.core.physics.world2d.BodyHandle, transform: object) -> None :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.set_body_transform ```` ````{py:method} set_body_velocity(handle: simvx.core.physics.world2d.BodyHandle, linear: simvx.core.math.Vec2, angular: float = 0.0) -> None :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.set_body_velocity ```` ````{py:method} set_body_mode(handle: simvx.core.physics.world2d.BodyHandle, mode: simvx.core.physics.world.BodyMode) -> None :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.set_body_mode ```` ````{py:method} body_velocity(handle: simvx.core.physics.world2d.BodyHandle) -> tuple[simvx.core.math.Vec2, float] :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.body_velocity ```` ````{py:method} body_transform(handle: simvx.core.physics.world2d.BodyHandle) -> tuple[simvx.core.math.Vec2, float] :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.body_transform ```` ````{py:method} sleeping(handle: simvx.core.physics.world2d.BodyHandle) -> bool :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.sleeping ```` ````{py:method} apply_impulse(handle: simvx.core.physics.world2d.BodyHandle, impulse: simvx.core.math.Vec2, *, at: simvx.core.math.Vec2 | None = None, angular: float = 0.0) -> None :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.apply_impulse ```` ````{py:method} apply_force(handle: simvx.core.physics.world2d.BodyHandle, force: simvx.core.math.Vec2, *, at: simvx.core.math.Vec2 | None = None) -> None :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.apply_force ```` ````{py:method} apply_torque(handle: simvx.core.physics.world2d.BodyHandle, torque: float) -> None :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.apply_torque ```` ````{py:method} create_fixed_joint(a: simvx.core.physics.world2d.BodyHandle, b: simvx.core.physics.world2d.BodyHandle) -> simvx.core.physics.world2d.JointHandle :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.create_fixed_joint ```` ````{py:method} create_pin_joint(a: simvx.core.physics.world2d.BodyHandle, b: simvx.core.physics.world2d.BodyHandle, anchor: simvx.core.math.Vec2) -> simvx.core.physics.world2d.JointHandle :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.create_pin_joint ```` ````{py:method} create_hinge_joint(a: simvx.core.physics.world2d.BodyHandle, b: simvx.core.physics.world2d.BodyHandle, anchor: simvx.core.math.Vec2) -> simvx.core.physics.world2d.JointHandle :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.create_hinge_joint ```` ````{py:method} create_spring_joint(a: simvx.core.physics.world2d.BodyHandle, b: simvx.core.physics.world2d.BodyHandle, rest_length: float, stiffness: float, damping: float) -> simvx.core.physics.world2d.JointHandle :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.create_spring_joint ```` ````{py:method} create_groove_joint(a: simvx.core.physics.world2d.BodyHandle, b: simvx.core.physics.world2d.BodyHandle, groove_a: simvx.core.math.Vec2, groove_b: simvx.core.math.Vec2, anchor_b: simvx.core.math.Vec2) -> simvx.core.physics.world2d.JointHandle :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.create_groove_joint ```` ````{py:method} remove_joint(handle: simvx.core.physics.world2d.JointHandle) -> None :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.remove_joint ```` ````{py:method} set_one_way(handle: simvx.core.physics.world2d.BodyHandle, enabled: bool, normal: simvx.core.math.Vec2 = _DEFAULT_UP_2D) -> None :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.set_one_way ```` ````{py:method} step(dt: float) -> None :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.step ```` ````{py:method} drain_contact_events() -> list[simvx.core.physics.world2d.ContactEvent2D] :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.drain_contact_events ```` ````{py:method} drain_overlap_events() -> list[simvx.core.physics.world2d.OverlapEvent2D] :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.drain_overlap_events ```` ````{py:method} register_bodies(handles: list[simvx.core.physics.world2d.BodyHandle]) -> None :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.register_bodies ```` ````{py:method} read_transforms(out: numpy.ndarray) -> None :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.read_transforms ```` ````{py:method} read_velocities(out: numpy.ndarray) -> None :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.read_velocities ```` ````{py:method} raycast(origin: simvx.core.math.Vec2, direction: simvx.core.math.Vec2, max_dist: float, *, mask: int = 4294967295) -> simvx.core.physics.world2d.RaycastHit2D | None :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.raycast ```` ````{py:method} raycast_all(origin: simvx.core.math.Vec2, direction: simvx.core.math.Vec2, max_dist: float, *, mask: int = 4294967295) -> list[simvx.core.physics.world2d.RaycastHit2D] :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.raycast_all ```` ````{py:method} shapecast(shape: simvx.core.physics.world2d.ShapeHandle, origin: simvx.core.math.Vec2, direction: simvx.core.math.Vec2, max_dist: float, *, mask: int = 4294967295) -> simvx.core.physics.world2d.Contact2D | None :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.shapecast ```` ````{py:method} overlap(shape: simvx.core.physics.world2d.ShapeHandle, transform: object, *, mask: int = 4294967295) -> list[simvx.core.physics.world2d.BodyHandle] :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.overlap ```` ````{py:method} move_and_collide(handle: simvx.core.physics.world2d.BodyHandle, motion: simvx.core.math.Vec2) -> simvx.core.physics.world2d.Contact2D | None :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.move_and_collide ```` ````{py:method} create_character(shape: simvx.core.physics.world2d.ShapeHandle, transform: object, *, up: simvx.core.math.Vec2 = _DEFAULT_UP_2D, slope_limit: float = math.radians(45.0), step_height: float = 0.0, skin_width: float = 0.001, collision_layer: int = 1, collision_mask: int = 4294967295) -> simvx.core.physics.world2d.CharacterHandle :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.create_character ```` ````{py:method} destroy_character(handle: simvx.core.physics.world2d.CharacterHandle) -> None :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.destroy_character ```` ````{py:method} set_character_transform(handle: simvx.core.physics.world2d.CharacterHandle, transform: object) -> None :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.set_character_transform ```` ````{py:method} character_transform(handle: simvx.core.physics.world2d.CharacterHandle) -> tuple[simvx.core.math.Vec2, float] :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.character_transform ```` ````{py:method} character_move_and_slide(handle: simvx.core.physics.world2d.CharacterHandle, velocity: simvx.core.math.Vec2, dt: float, *, up: simvx.core.math.Vec2, max_slides: int = 4) -> simvx.core.physics.world2d.CharacterMoveResult2D :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.character_move_and_slide ```{autodoc2-docstring} simvx.core.physics.pymunk_backend.PymunkPhysics2D.character_move_and_slide ``` ```` ````{py:method} capabilities() -> frozenset[simvx.core.physics.capability.Capability] :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.capabilities ```` ````{py:attribute} __slots__ :canonical: simvx.core.physics.pymunk_backend.PymunkPhysics2D.__slots__ :value: > () ```` ````` ````{py:function} register() -> None :canonical: simvx.core.physics.pymunk_backend.register ```{autodoc2-docstring} simvx.core.physics.pymunk_backend.register ``` ```` ````{py:data} __all__ :canonical: simvx.core.physics.pymunk_backend.__all__ :value: > ['PymunkPhysics2D', 'register'] ```{autodoc2-docstring} simvx.core.physics.pymunk_backend.__all__ ``` ````