1
0
Fork 0
tsgames/src/common/physics/index.ts

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;