diff --git a/docs/modules/box2d.md b/docs/modules/box2d.md index 58955cd8..5120b50d 100644 --- a/docs/modules/box2d.md +++ b/docs/modules/box2d.md @@ -43,17 +43,39 @@ It hides the details of Box2D's API and provides a high-level interface. ## API list ```python -from linalg import * +from linalg import vec2, vec4 from typing import Iterable -class _Node: +class _NodeLike: # duck-type protocol def on_contact_begin(self, other: 'Body'): ... def on_contact_end(self, other: 'Body'): ... +class DebugDraw: + # enum + # { + # e_shapeBit = 0x0001, ///< draw shapes + # e_jointBit = 0x0002, ///< draw joint connections + # e_aabbBit = 0x0004, ///< draw axis aligned bounding boxes + # e_pairBit = 0x0008, ///< draw broad-phase pairs + # e_centerOfMassBit = 0x0010 ///< draw center of mass frame + # }; + + def set_flags(self, flags: int): ... + def get_flags(self) -> int: ... + + # pure virtual functions + def draw_polygon(self, vertices: list[vec2], color: vec4): ... + def draw_solid_polygon(self, vertices: list[vec2], color: vec4): ... + def draw_circle(self, center: vec2, radius: float, color: vec4): ... + def draw_solid_circle(self, center: vec2, radius: float, axis: vec2, color: vec4): ... + def draw_segment(self, p1: vec2, p2: vec2, color: vec4): ... + def draw_transform(self, position: vec2, rotation: float): ... + def draw_point(self, p: vec2, size: float, color: vec4): ... + class World: gravity: vec2 # gravity of the world, by default vec2(0, 0) - def create_body(self, node: _Node = None) -> 'Body': + def create_body(self, node: _NodeLike = None) -> 'Body': """create a body in the world""" def get_bodies(self) -> Iterable['Body']: @@ -68,6 +90,15 @@ class World: def step(self, dt: float, velocity_iterations: int, position_iterations: int) -> None: """step the simulation, e.g. world.step(1/60, 8, 3)""" + def destroy(self): + """destroy this world.""" + + def debug_draw(self): + """draw debug shapes of all bodies in the world.""" + + def set_debug_draw(self, draw: DebugDraw): + """set the debug draw object.""" + class Body: type: int # 0-static, 1-kinematic, 2-dynamic, by default 2 mass: float @@ -94,7 +125,7 @@ class Body: def set_box_shape(self, hx: float, hy: float): ... def set_circle_shape(self, radius: float): ... def set_polygon_shape(self, points: list[vec2]): ... - def set_chain_shape(self, points: list[vec2]): ... + def set_chain_shape(self, points: list[vec2], loop: bool): ... def apply_force(self, force: vec2, point: vec2): ... def apply_force_to_center(self, force: vec2): ... @@ -103,7 +134,7 @@ class Body: def apply_linear_impulse_to_center(self, impulse: vec2): ... def apply_angular_impulse(self, impulse: float): ... - def get_node(self) -> _Node: + def get_node(self) -> _NodeLike: """return the node that is attached to this body.""" def get_contacts(self) -> list['Body']: