62 lines
1.9 KiB
TypeScript
62 lines
1.9 KiB
TypeScript
import E from './engine.c';
|
|
|
|
namespace Physics {
|
|
const TYPE_CIRCLE = 1;
|
|
const TYPE_PLANE = 2;
|
|
|
|
export function newCircle(x: number, y: number, radius: number, mass: number = 1.0): number {
|
|
const body = E.rigid_body_new_circle(x, y, 0, 0, mass, radius);
|
|
return body;
|
|
}
|
|
|
|
export function newPlane(x: number, y: number, nx: number, ny: number): number {
|
|
const body = E.rigid_body_new_plane(x, y, nx, ny);
|
|
return body;
|
|
}
|
|
|
|
export function deleteBody(body: number) {
|
|
E.rigid_body_free(body);
|
|
}
|
|
|
|
export function addForce(body: number, fx: number, fy: number) {
|
|
E.rigid_body_add_force(body, fx, fy);
|
|
}
|
|
|
|
export function addGlobalForce(fx: number, fy: number) {
|
|
E.rigid_body_add_global_force(fx, fy);
|
|
}
|
|
|
|
export function update(dt: number) {
|
|
E.rigid_body_update_all(dt);
|
|
}
|
|
|
|
export function getBody(idx: number) {
|
|
const ptr = E.rigid_body_get(idx);
|
|
const type = E.data.getUint8(ptr);
|
|
|
|
const x = E.data.getFloat32(ptr + 4, true);
|
|
const y = E.data.getFloat32(ptr + 8, true);
|
|
|
|
const vx = E.data.getFloat32(ptr + 12, true);
|
|
const vy = E.data.getFloat32(ptr + 16, true);
|
|
const mass = E.data.getFloat32(ptr + 20, true);
|
|
|
|
if (type === TYPE_CIRCLE) {
|
|
const radius = E.data.getFloat32(ptr + 24, true);
|
|
return { id: ptr, x, y, vx, vy, mass, radius };
|
|
} else if (type === TYPE_PLANE) {
|
|
const nx = E.data.getFloat32(ptr + 24, true);
|
|
const ny = E.data.getFloat32(ptr + 28, true);
|
|
return { id: ptr, type, x, y, vx, vy, mass, nx, ny };
|
|
}
|
|
|
|
return { id: ptr, type, x, y, vx, vy, mass };
|
|
}
|
|
|
|
export function setCollisionCallback(cb: (a: number, b: number) => void) {
|
|
E.rigid_body_set_collision_callback(cb);
|
|
}
|
|
}
|
|
|
|
export default Physics;
|