mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 03:20:18 +00:00
...
This commit is contained in:
parent
f9c0a95237
commit
fe64c2d5be
@ -42,105 +42,7 @@ It hides the details of Box2D's API and provides a high-level interface.
|
|||||||
|
|
||||||
## API list
|
## API list
|
||||||
|
|
||||||
```python
|
...
|
||||||
from linalg import vec2, vec4
|
|
||||||
from typing import Iterable
|
|
||||||
|
|
||||||
class _NodeLike: # duck-type protocol
|
|
||||||
def on_contact_begin(self, other: 'Body'): ...
|
|
||||||
def on_contact_end(self, other: 'Body'): ...
|
|
||||||
|
|
||||||
class _DrawLike: # duck-type protocol
|
|
||||||
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 get_bodies(self) -> Iterable['Body']:
|
|
||||||
"""return all bodies in the world."""
|
|
||||||
|
|
||||||
def ray_cast(self, start: vec2, end: vec2) -> list['Body']:
|
|
||||||
"""raycast from start to end"""
|
|
||||||
|
|
||||||
def box_cast(self, lower: vec2, upper: vec2) -> list['Body']:
|
|
||||||
"""query bodies in the AABB region."""
|
|
||||||
|
|
||||||
def step(self, dt: float, velocity_iterations: int, position_iterations: int) -> None:
|
|
||||||
"""step the simulation, e.g. world.step(1/60, 8, 3)"""
|
|
||||||
|
|
||||||
# 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 debug_draw(self, flags: int):
|
|
||||||
"""draw debug shapes of all bodies in the world."""
|
|
||||||
|
|
||||||
def set_debug_draw(self, draw: _DrawLike):
|
|
||||||
"""set the debug draw object."""
|
|
||||||
|
|
||||||
def create_weld_joint(self, body_a: 'Body', body_b: 'Body'):
|
|
||||||
"""create a weld joint between two bodies."""
|
|
||||||
|
|
||||||
class Body:
|
|
||||||
type: int # 0-static, 1-kinematic, 2-dynamic, by default 2
|
|
||||||
gravity_scale: float
|
|
||||||
fixed_rotation: bool
|
|
||||||
enabled: bool
|
|
||||||
bullet: bool # whether to use continuous collision detection
|
|
||||||
|
|
||||||
@property
|
|
||||||
def mass(self) -> float: ...
|
|
||||||
@property
|
|
||||||
def inertia(self) -> float: ...
|
|
||||||
|
|
||||||
position: vec2
|
|
||||||
rotation: float # in radians (counter-clockwise)
|
|
||||||
velocity: vec2 # linear velocity
|
|
||||||
angular_velocity: float
|
|
||||||
damping: float # linear damping
|
|
||||||
angular_damping: float
|
|
||||||
|
|
||||||
# fixture settings
|
|
||||||
density: float
|
|
||||||
friction: float
|
|
||||||
restitution: float
|
|
||||||
restitution_threshold: float
|
|
||||||
is_sensor: bool
|
|
||||||
|
|
||||||
def __new__(cls, world: World, node: _NodeLike = None):
|
|
||||||
"""create a body in the world."""
|
|
||||||
|
|
||||||
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 apply_force(self, force: vec2, point: vec2): ...
|
|
||||||
def apply_force_to_center(self, force: vec2): ...
|
|
||||||
def apply_torque(self, torque: float): ...
|
|
||||||
def apply_impulse(self, impulse: vec2, point: vec2): ...
|
|
||||||
def apply_impulse_to_center(self, impulse: vec2): ...
|
|
||||||
def apply_angular_impulse(self, impulse: float): ...
|
|
||||||
|
|
||||||
def get_node(self) -> _NodeLike:
|
|
||||||
"""return the node that is attached to this body."""
|
|
||||||
|
|
||||||
def get_contacts(self) -> list['Body']:
|
|
||||||
"""return all bodies that are in contact with this body."""
|
|
||||||
|
|
||||||
def destroy(self):
|
|
||||||
"""destroy this body."""
|
|
||||||
```
|
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||
|
@ -3,149 +3,4 @@ icon: package
|
|||||||
label: c
|
label: c
|
||||||
---
|
---
|
||||||
|
|
||||||
Interop with pointers and C structs.
|
Interop with pointers and C structs.
|
||||||
|
|
||||||
```python
|
|
||||||
from typing import overload
|
|
||||||
|
|
||||||
def malloc(size: int) -> 'void_p': ...
|
|
||||||
def free(ptr: 'void_p') -> None: ...
|
|
||||||
def sizeof(type: str) -> int: ...
|
|
||||||
def refl(name: str) -> '_refl': ...
|
|
||||||
def memset(ptr: 'void_p', value: int, size: int) -> None: ...
|
|
||||||
def memcpy(dst: 'void_p', src: 'void_p', size: int) -> None: ...
|
|
||||||
|
|
||||||
class _refl:
|
|
||||||
def __call__(self) -> 'struct': ...
|
|
||||||
def __getitem__(self, key: str) -> int: ...
|
|
||||||
def name(self) -> str: ...
|
|
||||||
def size(self) -> int: ...
|
|
||||||
|
|
||||||
class void_p:
|
|
||||||
def __add__(self, i: int) -> 'void_p': ...
|
|
||||||
def __sub__(self, i: int) -> 'void_p': ...
|
|
||||||
def __eq__(self, other: 'void_p') -> bool: ...
|
|
||||||
def __ne__(self, other: 'void_p') -> bool: ...
|
|
||||||
def offset(self, i: int) -> 'void_p': ...
|
|
||||||
|
|
||||||
def hex(self) -> str: ...
|
|
||||||
@staticmethod
|
|
||||||
def from_hex(s: str) -> 'void_p': ...
|
|
||||||
|
|
||||||
def read_char(self) -> int: ...
|
|
||||||
def read_uchar(self) -> int: ...
|
|
||||||
def read_short(self) -> int: ...
|
|
||||||
def read_ushort(self) -> int: ...
|
|
||||||
def read_int(self) -> int: ...
|
|
||||||
def read_uint(self) -> int: ...
|
|
||||||
def read_long(self) -> int: ...
|
|
||||||
def read_ulong(self) -> int: ...
|
|
||||||
def read_longlong(self) -> int: ...
|
|
||||||
def read_ulonglong(self) -> int: ...
|
|
||||||
def read_float(self) -> float: ...
|
|
||||||
def read_double(self) -> float: ...
|
|
||||||
def read_bool(self) -> bool: ...
|
|
||||||
def read_void_p(self) -> 'void_p': ...
|
|
||||||
def read_bytes(self, size: int) -> bytes: ...
|
|
||||||
def read_struct(self, type: str) -> 'struct': ...
|
|
||||||
|
|
||||||
def write_char(self, value: int) -> None: ...
|
|
||||||
def write_uchar(self, value: int) -> None: ...
|
|
||||||
def write_short(self, value: int) -> None: ...
|
|
||||||
def write_ushort(self, value: int) -> None: ...
|
|
||||||
def write_int(self, value: int) -> None: ...
|
|
||||||
def write_uint(self, value: int) -> None: ...
|
|
||||||
def write_long(self, value: int) -> None: ...
|
|
||||||
def write_ulong(self, value: int) -> None: ...
|
|
||||||
def write_longlong(self, value: int) -> None: ...
|
|
||||||
def write_ulonglong(self, value: int) -> None: ...
|
|
||||||
def write_float(self, value: float) -> None: ...
|
|
||||||
def write_double(self, value: float) -> None: ...
|
|
||||||
def write_bool(self, value: bool) -> None: ...
|
|
||||||
def write_void_p(self, value: 'void_p') -> None: ...
|
|
||||||
def write_bytes(self, value: bytes) -> None: ...
|
|
||||||
def write_struct(self, value: 'struct') -> None: ...
|
|
||||||
|
|
||||||
def get_base_offset(self) -> int: ...
|
|
||||||
@overload
|
|
||||||
def set_base_offset(self, offset: int) -> None: ...
|
|
||||||
@overload
|
|
||||||
def set_base_offset(self, offset: str) -> None: ...
|
|
||||||
|
|
||||||
class struct:
|
|
||||||
@overload
|
|
||||||
def __init__(self, size: int): ...
|
|
||||||
@overload
|
|
||||||
def __init__(self, p: 'void_p', size: int): ...
|
|
||||||
@overload
|
|
||||||
def __init__(self, s: str): ...
|
|
||||||
@overload
|
|
||||||
def __init__(self, b: bytes): ...
|
|
||||||
|
|
||||||
def addr(self) -> 'void_p': ...
|
|
||||||
def copy(self) -> 'struct': ...
|
|
||||||
def size(self) -> int: ...
|
|
||||||
def __eq__(self, other: 'struct') -> bool: ...
|
|
||||||
def __ne__(self, other: 'struct') -> bool: ...
|
|
||||||
|
|
||||||
def to_string(self) -> str: ...
|
|
||||||
def to_bytes(self) -> bytes: ...
|
|
||||||
|
|
||||||
def read_char(self, offset=0) -> int: ...
|
|
||||||
def read_uchar(self, offset=0) -> int: ...
|
|
||||||
def read_short(self, offset=0) -> int: ...
|
|
||||||
def read_ushort(self, offset=0) -> int: ...
|
|
||||||
def read_int(self, offset=0) -> int: ...
|
|
||||||
def read_uint(self, offset=0) -> int: ...
|
|
||||||
def read_long(self, offset=0) -> int: ...
|
|
||||||
def read_ulong(self, offset=0) -> int: ...
|
|
||||||
def read_longlong(self, offset=0) -> int: ...
|
|
||||||
def read_ulonglong(self, offset=0) -> int: ...
|
|
||||||
def read_float(self, offset=0) -> float: ...
|
|
||||||
def read_double(self, offset=0) -> float: ...
|
|
||||||
def read_bool(self, offset=0) -> bool: ...
|
|
||||||
def read_void_p(self, offset=0) -> 'void_p': ...
|
|
||||||
|
|
||||||
def write_char(self, value: int, offset=0) -> None: ...
|
|
||||||
def write_uchar(self, value: int, offset=0) -> None: ...
|
|
||||||
def write_short(self, value: int, offset=0) -> None: ...
|
|
||||||
def write_ushort(self, value: int, offset=0) -> None: ...
|
|
||||||
def write_int(self, value: int, offset=0) -> None: ...
|
|
||||||
def write_uint(self, value: int, offset=0) -> None: ...
|
|
||||||
def write_long(self, value: int, offset=0) -> None: ...
|
|
||||||
def write_ulong(self, value: int, offset=0) -> None: ...
|
|
||||||
def write_longlong(self, value: int, offset=0) -> None: ...
|
|
||||||
def write_ulonglong(self, value: int, offset=0) -> None: ...
|
|
||||||
def write_float(self, value: float, offset=0) -> None: ...
|
|
||||||
def write_double(self, value: float, offset=0) -> None: ...
|
|
||||||
def write_bool(self, value: bool, offset=0) -> None: ...
|
|
||||||
def write_void_p(self, value: 'void_p', offset=0) -> None: ...
|
|
||||||
|
|
||||||
char_ = refl("char")
|
|
||||||
uchar_ = refl("uchar")
|
|
||||||
short_ = refl("short")
|
|
||||||
ushort_ = refl("ushort")
|
|
||||||
int_ = refl("int")
|
|
||||||
uint_ = refl("uint")
|
|
||||||
long_ = refl("long")
|
|
||||||
ulong_ = refl("ulong")
|
|
||||||
longlong_ = refl("longlong")
|
|
||||||
ulonglong_ = refl("ulonglong")
|
|
||||||
float_ = refl("float")
|
|
||||||
double_ = refl("double")
|
|
||||||
bool_ = refl("bool")
|
|
||||||
|
|
||||||
char_p = void_p
|
|
||||||
uchar_p = void_p
|
|
||||||
short_p = void_p
|
|
||||||
ushort_p = void_p
|
|
||||||
int_p = void_p
|
|
||||||
uint_p = void_p
|
|
||||||
long_p = void_p
|
|
||||||
ulong_p = void_p
|
|
||||||
longlong_p = void_p
|
|
||||||
ulonglong_p = void_p
|
|
||||||
float_p = void_p
|
|
||||||
double_p = void_p
|
|
||||||
bool_p = void_p
|
|
||||||
```
|
|
@ -3,126 +3,4 @@ icon: package
|
|||||||
label: linalg
|
label: linalg
|
||||||
---
|
---
|
||||||
|
|
||||||
Provide `mat3x3`, `vec2`, `vec3` and `vec4` types.
|
Provide `mat3x3`, `vec2`, `vec3` and `vec4` types.
|
||||||
|
|
||||||
```python
|
|
||||||
from typing import overload
|
|
||||||
from c import float_p
|
|
||||||
|
|
||||||
class vec2:
|
|
||||||
x: float
|
|
||||||
y: float
|
|
||||||
|
|
||||||
def __init__(self, x: float, y: float) -> None: ...
|
|
||||||
def copy(self) -> vec2: ...
|
|
||||||
def __add__(self, other: vec2) -> vec2: ...
|
|
||||||
def __sub__(self, other: vec2) -> vec2: ...
|
|
||||||
def __mul__(self, other: float) -> vec2: ...
|
|
||||||
def __truediv__(self, other: float) -> vec2: ...
|
|
||||||
def dot(self, other: vec2) -> float: ...
|
|
||||||
def cross(self, other: vec2) -> float: ...
|
|
||||||
def length(self) -> float: ...
|
|
||||||
def length_squared(self) -> float: ...
|
|
||||||
def normalize(self) -> vec2: ...
|
|
||||||
def rotate(self, radians: float) -> vec2: ...
|
|
||||||
def addr(self) -> float_p: ...
|
|
||||||
|
|
||||||
class vec3:
|
|
||||||
x: float
|
|
||||||
y: float
|
|
||||||
z: float
|
|
||||||
|
|
||||||
def __init__(self, x: float, y: float, z: float) -> None: ...
|
|
||||||
def copy(self) -> vec3: ...
|
|
||||||
def __add__(self, other: vec3) -> vec3: ...
|
|
||||||
def __sub__(self, other: vec3) -> vec3: ...
|
|
||||||
def __mul__(self, other: float) -> vec3: ...
|
|
||||||
def __truediv__(self, other: float) -> vec3: ...
|
|
||||||
def dot(self, other: vec3) -> float: ...
|
|
||||||
def cross(self, other: vec3) -> float: ...
|
|
||||||
def length(self) -> float: ...
|
|
||||||
def length_squared(self) -> float: ...
|
|
||||||
def normalize(self) -> vec3: ...
|
|
||||||
def addr(self) -> float_p: ...
|
|
||||||
|
|
||||||
class vec4:
|
|
||||||
x: float
|
|
||||||
y: float
|
|
||||||
z: float
|
|
||||||
w: float
|
|
||||||
|
|
||||||
def __init__(self, x: float, y: float, z: float, w: float) -> None: ...
|
|
||||||
def copy(self) -> vec4: ...
|
|
||||||
def __add__(self, other: vec4) -> vec4: ...
|
|
||||||
def __sub__(self, other: vec4) -> vec4: ...
|
|
||||||
def __mul__(self, other: float) -> vec4: ...
|
|
||||||
def __truediv__(self, other: float) -> vec4: ...
|
|
||||||
def dot(self, other: vec4) -> float: ...
|
|
||||||
def length(self) -> float: ...
|
|
||||||
def length_squared(self) -> float: ...
|
|
||||||
def normalize(self) -> vec4: ...
|
|
||||||
def addr(self) -> float_p: ...
|
|
||||||
|
|
||||||
class mat3x3:
|
|
||||||
_11: float
|
|
||||||
_12: float
|
|
||||||
_13: float
|
|
||||||
_21: float
|
|
||||||
_22: float
|
|
||||||
_23: float
|
|
||||||
_31: float
|
|
||||||
_32: float
|
|
||||||
_33: float
|
|
||||||
|
|
||||||
@overload
|
|
||||||
def __init__(self) -> None: ...
|
|
||||||
@overload
|
|
||||||
def __init__(self, _11, _12, _13, _21, _22, _23, _31, _32, _33) -> None: ...
|
|
||||||
@overload
|
|
||||||
def __init__(self, a: list[list]): ...
|
|
||||||
|
|
||||||
def set_zeros(self) -> None: ...
|
|
||||||
def set_ones(self) -> None: ...
|
|
||||||
def set_identity(self) -> None: ...
|
|
||||||
|
|
||||||
def copy(self) -> mat3x3: ...
|
|
||||||
def __getitem__(self, index: tuple[int, int]) -> float: ...
|
|
||||||
def __setitem__(self, index: tuple[int, int], value: float) -> None: ...
|
|
||||||
def __add__(self, other: mat3x3) -> mat3x3: ...
|
|
||||||
def __sub__(self, other: mat3x3) -> mat3x3: ...
|
|
||||||
def __mul__(self, other: float) -> mat3x3: ...
|
|
||||||
def __truediv__(self, other: float) -> mat3x3: ...
|
|
||||||
@overload
|
|
||||||
def __matmul__(self, other: mat3x3) -> mat3x3: ...
|
|
||||||
@overload
|
|
||||||
def __matmul__(self, other: vec3) -> vec3: ...
|
|
||||||
@overload
|
|
||||||
def matmul(self, other: mat3x3) -> mat3x3: ...
|
|
||||||
@overload
|
|
||||||
def matmul(self, other: vec3) -> vec3: ...
|
|
||||||
def determinant(self) -> float: ...
|
|
||||||
def transpose(self) -> mat3x3: ...
|
|
||||||
def inverse(self) -> mat3x3: ...
|
|
||||||
|
|
||||||
def __invert__(self) -> mat3x3: ...
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def zeros() -> mat3x3: ...
|
|
||||||
@staticmethod
|
|
||||||
def ones() -> mat3x3: ...
|
|
||||||
@staticmethod
|
|
||||||
def identity() -> mat3x3: ...
|
|
||||||
|
|
||||||
# affine transformations
|
|
||||||
@staticmethod
|
|
||||||
def trs(t: vec2, r: float, s: vec2) -> mat3x3: ...
|
|
||||||
|
|
||||||
def is_affine(self) -> bool: ...
|
|
||||||
|
|
||||||
def translation(self) -> vec2: ...
|
|
||||||
def rotation(self) -> float: ...
|
|
||||||
def scale(self) -> vec2: ...
|
|
||||||
|
|
||||||
def transform_point(self, p: vec2) -> vec2: ...
|
|
||||||
def transform_vector(self, v: vec2) -> vec2: ...
|
|
||||||
```
|
|
97
include/typings/box2d.pyi
Normal file
97
include/typings/box2d.pyi
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
from linalg import vec2, vec4
|
||||||
|
from typing import Iterable
|
||||||
|
|
||||||
|
class _NodeLike: # duck-type protocol
|
||||||
|
def on_contact_begin(self, other: 'Body'): ...
|
||||||
|
def on_contact_end(self, other: 'Body'): ...
|
||||||
|
|
||||||
|
class _DrawLike: # duck-type protocol
|
||||||
|
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 get_bodies(self) -> Iterable['Body']:
|
||||||
|
"""return all bodies in the world."""
|
||||||
|
|
||||||
|
def ray_cast(self, start: vec2, end: vec2) -> list['Body']:
|
||||||
|
"""raycast from start to end"""
|
||||||
|
|
||||||
|
def box_cast(self, lower: vec2, upper: vec2) -> list['Body']:
|
||||||
|
"""query bodies in the AABB region."""
|
||||||
|
|
||||||
|
def step(self, dt: float, velocity_iterations: int, position_iterations: int) -> None:
|
||||||
|
"""step the simulation, e.g. world.step(1/60, 8, 3)"""
|
||||||
|
|
||||||
|
# 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 debug_draw(self, flags: int):
|
||||||
|
"""draw debug shapes of all bodies in the world."""
|
||||||
|
|
||||||
|
def set_debug_draw(self, draw: _DrawLike):
|
||||||
|
"""set the debug draw object."""
|
||||||
|
|
||||||
|
def create_weld_joint(self, body_a: 'Body', body_b: 'Body'):
|
||||||
|
"""create a weld joint between two bodies."""
|
||||||
|
|
||||||
|
class Body:
|
||||||
|
type: int # 0-static, 1-kinematic, 2-dynamic, by default 2
|
||||||
|
gravity_scale: float
|
||||||
|
fixed_rotation: bool
|
||||||
|
enabled: bool
|
||||||
|
bullet: bool # whether to use continuous collision detection
|
||||||
|
|
||||||
|
@property
|
||||||
|
def mass(self) -> float: ...
|
||||||
|
@property
|
||||||
|
def inertia(self) -> float: ...
|
||||||
|
|
||||||
|
position: vec2
|
||||||
|
rotation: float # in radians (counter-clockwise)
|
||||||
|
velocity: vec2 # linear velocity
|
||||||
|
angular_velocity: float
|
||||||
|
damping: float # linear damping
|
||||||
|
angular_damping: float
|
||||||
|
|
||||||
|
# fixture settings
|
||||||
|
density: float
|
||||||
|
friction: float
|
||||||
|
restitution: float
|
||||||
|
restitution_threshold: float
|
||||||
|
is_sensor: bool
|
||||||
|
|
||||||
|
def __new__(cls, world: World, node: _NodeLike = None):
|
||||||
|
"""create a body in the world."""
|
||||||
|
|
||||||
|
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 apply_force(self, force: vec2, point: vec2): ...
|
||||||
|
def apply_force_to_center(self, force: vec2): ...
|
||||||
|
def apply_torque(self, torque: float): ...
|
||||||
|
def apply_impulse(self, impulse: vec2, point: vec2): ...
|
||||||
|
def apply_impulse_to_center(self, impulse: vec2): ...
|
||||||
|
def apply_angular_impulse(self, impulse: float): ...
|
||||||
|
|
||||||
|
def get_node(self) -> _NodeLike:
|
||||||
|
"""return the node that is attached to this body."""
|
||||||
|
|
||||||
|
def get_contacts(self) -> list['Body']:
|
||||||
|
"""return all bodies that are in contact with this body."""
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
|
"""destroy this body."""
|
@ -78,25 +78,21 @@ class mat3x3:
|
|||||||
def set_identity(self) -> None: ...
|
def set_identity(self) -> None: ...
|
||||||
|
|
||||||
def copy(self) -> mat3x3: ...
|
def copy(self) -> mat3x3: ...
|
||||||
|
def determinant(self) -> float: ...
|
||||||
|
def transpose(self) -> mat3x3: ...
|
||||||
|
|
||||||
def __getitem__(self, index: tuple[int, int]) -> float: ...
|
def __getitem__(self, index: tuple[int, int]) -> float: ...
|
||||||
def __setitem__(self, index: tuple[int, int], value: float) -> None: ...
|
def __setitem__(self, index: tuple[int, int], value: float) -> None: ...
|
||||||
def __add__(self, other: mat3x3) -> mat3x3: ...
|
def __add__(self, other: mat3x3) -> mat3x3: ...
|
||||||
def __sub__(self, other: mat3x3) -> mat3x3: ...
|
def __sub__(self, other: mat3x3) -> mat3x3: ...
|
||||||
def __mul__(self, other: float) -> mat3x3: ...
|
def __mul__(self, other: float) -> mat3x3: ...
|
||||||
def __truediv__(self, other: float) -> mat3x3: ...
|
def __truediv__(self, other: float) -> mat3x3: ...
|
||||||
|
|
||||||
|
def __invert__(self) -> mat3x3: ...
|
||||||
@overload
|
@overload
|
||||||
def __matmul__(self, other: mat3x3) -> mat3x3: ...
|
def __matmul__(self, other: mat3x3) -> mat3x3: ...
|
||||||
@overload
|
@overload
|
||||||
def __matmul__(self, other: vec3) -> vec3: ...
|
def __matmul__(self, other: vec3) -> vec3: ...
|
||||||
@overload
|
|
||||||
def matmul(self, other: mat3x3) -> mat3x3: ...
|
|
||||||
@overload
|
|
||||||
def matmul(self, other: vec3) -> vec3: ...
|
|
||||||
def determinant(self) -> float: ...
|
|
||||||
def transpose(self) -> mat3x3: ...
|
|
||||||
def inverse(self) -> mat3x3: ...
|
|
||||||
|
|
||||||
def __invert__(self) -> mat3x3: ...
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def zeros() -> mat3x3: ...
|
def zeros() -> mat3x3: ...
|
@ -267,21 +267,20 @@ namespace pkpy{
|
|||||||
return VAR(self.m[i][j]);
|
return VAR(self.m[i][j]);
|
||||||
});
|
});
|
||||||
|
|
||||||
vm->bind_method<2>(type, "__setitem__", [](VM* vm, ArgsView args){
|
vm->bind__setitem__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* obj, PyObject* index, PyObject* value){
|
||||||
PyMat3x3& self = _CAST(PyMat3x3&, args[0]);
|
PyMat3x3& self = _CAST(PyMat3x3&, obj);
|
||||||
Tuple& t = CAST(Tuple&, args[1]);
|
Tuple& t = CAST(Tuple&, index);
|
||||||
if(t.size() != 2){
|
if(t.size() != 2){
|
||||||
vm->TypeError("Mat3x3.__setitem__ takes a tuple of 2 integers");
|
vm->TypeError("Mat3x3.__setitem__ takes a tuple of 2 integers");
|
||||||
return vm->None;
|
return;
|
||||||
}
|
}
|
||||||
i64 i = CAST(i64, t[0]);
|
i64 i = CAST(i64, t[0]);
|
||||||
i64 j = CAST(i64, t[1]);
|
i64 j = CAST(i64, t[1]);
|
||||||
if(i < 0 || i >= 3 || j < 0 || j >= 3){
|
if(i < 0 || i >= 3 || j < 0 || j >= 3){
|
||||||
vm->IndexError("index out of range");
|
vm->IndexError("index out of range");
|
||||||
return vm->None;
|
return;
|
||||||
}
|
}
|
||||||
self.m[i][j] = CAST_F(args[2]);
|
self.m[i][j] = CAST_F(value);
|
||||||
return vm->None;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
#define PROPERTY_FIELD(field) \
|
#define PROPERTY_FIELD(field) \
|
||||||
@ -307,56 +306,53 @@ namespace pkpy{
|
|||||||
|
|
||||||
#undef PROPERTY_FIELD
|
#undef PROPERTY_FIELD
|
||||||
|
|
||||||
vm->bind_method<1>(type, "__add__", [](VM* vm, ArgsView args){
|
vm->bind__add__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* _0, PyObject* _1){
|
||||||
PyMat3x3& self = _CAST(PyMat3x3&, args[0]);
|
PyMat3x3& self = _CAST(PyMat3x3&, _0);
|
||||||
PyMat3x3& other = CAST(PyMat3x3&, args[1]);
|
PyMat3x3& other = CAST(PyMat3x3&, _1);
|
||||||
return VAR_T(PyMat3x3, self + other);
|
return VAR_T(PyMat3x3, self + other);
|
||||||
});
|
});
|
||||||
|
|
||||||
vm->bind_method<1>(type, "__sub__", [](VM* vm, ArgsView args){
|
vm->bind__sub__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* _0, PyObject* _1){
|
||||||
PyMat3x3& self = _CAST(PyMat3x3&, args[0]);
|
PyMat3x3& self = _CAST(PyMat3x3&, _0);
|
||||||
PyMat3x3& other = CAST(PyMat3x3&, args[1]);
|
PyMat3x3& other = CAST(PyMat3x3&, _1);
|
||||||
return VAR_T(PyMat3x3, self - other);
|
return VAR_T(PyMat3x3, self - other);
|
||||||
});
|
});
|
||||||
|
|
||||||
vm->bind_method<1>(type, "__mul__", [](VM* vm, ArgsView args){
|
vm->bind__mul__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* _0, PyObject* _1){
|
||||||
PyMat3x3& self = _CAST(PyMat3x3&, args[0]);
|
PyMat3x3& self = _CAST(PyMat3x3&, _0);
|
||||||
f64 other = CAST_F(args[1]);
|
f64 other = CAST_F(_1);
|
||||||
return VAR_T(PyMat3x3, self * other);
|
return VAR_T(PyMat3x3, self * other);
|
||||||
});
|
});
|
||||||
|
|
||||||
vm->bind_method<1>(type, "__rmul__", [](VM* vm, ArgsView args){
|
vm->bind_method<1>(type, "__rmul__", [](VM* vm, ArgsView args){
|
||||||
PyMat3x3& self = _CAST(PyMat3x3&, args[0]);
|
PyMat3x3& self = _CAST(PyMat3x3&, args[0]);
|
||||||
f64 other = CAST_F(args[1]);
|
f64 other = CAST_F(args[1]);
|
||||||
return VAR_T(PyMat3x3, self * other);
|
return VAR_T(PyMat3x3, self * other);
|
||||||
});
|
});
|
||||||
|
|
||||||
vm->bind_method<1>(type, "__truediv__", [](VM* vm, ArgsView args){
|
vm->bind__truediv__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* _0, PyObject* _1){
|
||||||
PyMat3x3& self = _CAST(PyMat3x3&, args[0]);
|
PyMat3x3& self = _CAST(PyMat3x3&, _0);
|
||||||
f64 other = CAST_F(args[1]);
|
f64 other = CAST_F(_1);
|
||||||
return VAR_T(PyMat3x3, self / other);
|
return VAR_T(PyMat3x3, self / other);
|
||||||
});
|
});
|
||||||
|
|
||||||
auto f_mm = [](VM* vm, ArgsView args){
|
vm->bind__matmul__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* _0, PyObject* _1){
|
||||||
PyMat3x3& self = _CAST(PyMat3x3&, args[0]);
|
PyMat3x3& self = _CAST(PyMat3x3&, _0);
|
||||||
if(is_non_tagged_type(args[1], PyMat3x3::_type(vm))){
|
if(is_non_tagged_type(_1, PyMat3x3::_type(vm))){
|
||||||
PyMat3x3& other = _CAST(PyMat3x3&, args[1]);
|
PyMat3x3& other = _CAST(PyMat3x3&, _1);
|
||||||
return VAR_T(PyMat3x3, self.matmul(other));
|
return VAR_T(PyMat3x3, self.matmul(other));
|
||||||
}
|
}
|
||||||
if(is_non_tagged_type(args[1], PyVec3::_type(vm))){
|
if(is_non_tagged_type(_1, PyVec3::_type(vm))){
|
||||||
PyVec3& other = _CAST(PyVec3&, args[1]);
|
PyVec3& other = _CAST(PyVec3&, _1);
|
||||||
return VAR_T(PyVec3, self.matmul(other));
|
return VAR_T(PyVec3, self.matmul(other));
|
||||||
}
|
}
|
||||||
vm->BinaryOptError("@");
|
return vm->NotImplemented;
|
||||||
return vm->None;
|
});
|
||||||
};
|
|
||||||
|
|
||||||
vm->bind_method<1>(type, "__matmul__", f_mm);
|
vm->bind__eq__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* _0, PyObject* _1){
|
||||||
vm->bind_method<1>(type, "matmul", f_mm);
|
PyMat3x3& self = _CAST(PyMat3x3&, _0);
|
||||||
|
if(is_non_tagged_type(_1, PyMat3x3::_type(vm))){
|
||||||
vm->bind_method<1>(type, "__eq__", [](VM* vm, ArgsView args){
|
PyMat3x3& other = _CAST(PyMat3x3&, _1);
|
||||||
PyMat3x3& self = _CAST(PyMat3x3&, args[0]);
|
|
||||||
if(is_non_tagged_type(args[1], PyMat3x3::_type(vm))){
|
|
||||||
PyMat3x3& other = _CAST(PyMat3x3&, args[1]);
|
|
||||||
return VAR(self == other);
|
return VAR(self == other);
|
||||||
}
|
}
|
||||||
return vm->NotImplemented;
|
return vm->NotImplemented;
|
||||||
@ -372,14 +368,6 @@ namespace pkpy{
|
|||||||
return VAR_T(PyMat3x3, self.transpose());
|
return VAR_T(PyMat3x3, self.transpose());
|
||||||
});
|
});
|
||||||
|
|
||||||
vm->bind_method<0>(type, "inverse", [](VM* vm, ArgsView args){
|
|
||||||
PyMat3x3& self = _CAST(PyMat3x3&, args[0]);
|
|
||||||
Mat3x3 ret;
|
|
||||||
bool ok = self.inverse(ret);
|
|
||||||
if(!ok) vm->ValueError("matrix is not invertible");
|
|
||||||
return VAR_T(PyMat3x3, ret);
|
|
||||||
});
|
|
||||||
|
|
||||||
vm->bind__invert__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* obj){
|
vm->bind__invert__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* obj){
|
||||||
PyMat3x3& self = _CAST(PyMat3x3&, obj);
|
PyMat3x3& self = _CAST(PyMat3x3&, obj);
|
||||||
Mat3x3 ret;
|
Mat3x3 ret;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user