Files
armorpaint/base/sources/ts/physics_body.ts
T

116 lines
3.5 KiB
TypeScript
Raw Normal View History

2024-03-13 23:50:11 +01:00
///if arm_physics
2025-03-11 15:17:26 +01:00
///include "../libs/asim.h"
2024-08-05 23:24:40 +02:00
2025-02-28 18:27:40 +01:00
declare function asim_body_create(shape: i32, mass: f32, dimx: f32, dimy: f32, dimz: f32, x: f32, y: f32, z: f32, triangles: f32[]): any;
declare function asim_body_apply_impulse(body: any, x: f32, y: f32, z: f32): void;
declare function asim_body_get_pos(body: any, pos: vec4_t): void; // vec4_ptr_t
declare function asim_body_get_rot(body: any, rot: quat_t): void; // quat_ptr_t
declare function asim_body_sync_transform(body: any, pos: vec4_t, rot: quat_t): void;
declare function asim_body_remove(body: any): void;
2024-08-05 23:24:40 +02:00
2024-03-21 21:06:41 +01:00
type physics_body_t = {
2024-08-05 23:24:40 +02:00
_body?: any;
shape?: physics_shape_t;
mass?: f32;
dimx?: f32;
2024-11-27 15:21:42 +01:00
dimy?: f32;
dimz?: f32;
2024-08-05 23:24:40 +02:00
obj?: object_t;
2024-03-21 21:06:41 +01:00
};
2024-03-13 23:50:11 +01:00
2024-08-02 20:41:11 +02:00
enum physics_shape_t {
2024-11-27 15:21:42 +01:00
BOX = 0,
SPHERE = 1,
2024-12-04 19:20:49 +01:00
HULL = 2,
2024-12-19 21:34:59 +01:00
TERRAIN = 3,
MESH = 4,
2024-03-13 23:50:11 +01:00
}
2024-08-05 23:24:40 +02:00
let physics_body_object_map: map_t<i32, physics_body_t> = map_create();
2024-03-13 23:50:11 +01:00
2024-08-02 20:41:11 +02:00
function physics_body_create(): physics_body_t {
2024-08-05 23:24:40 +02:00
let body: physics_body_t = {};
return body;
2024-03-13 23:50:11 +01:00
}
2024-08-05 23:24:40 +02:00
function physics_body_init(body: physics_body_t, obj: object_t) {
map_set(physics_body_object_map, obj.uid, body);
2024-03-13 23:50:11 +01:00
2024-08-05 23:24:40 +02:00
body.obj = obj;
2024-11-29 12:54:02 +01:00
transform_compute_dim(obj.transform);
2024-08-05 23:24:40 +02:00
body.dimx = obj.transform.dim.x;
2024-11-29 12:54:02 +01:00
body.dimy = obj.transform.dim.y;
body.dimz = obj.transform.dim.z;
2024-08-05 23:24:40 +02:00
2025-02-28 18:27:40 +01:00
let scale_pos: f32 = 1.0;
let posa: i16[] = null;
let inda: u32[] = null;
2024-11-30 23:35:41 +01:00
if (body.shape == physics_shape_t.MESH ||
2024-12-19 21:34:59 +01:00
body.shape == physics_shape_t.HULL ||
body.shape == physics_shape_t.TERRAIN
2024-11-30 23:35:41 +01:00
) {
2024-08-05 23:24:40 +02:00
let mo: mesh_object_t = obj.ext;
let data: mesh_data_t = mo.data;
let scale: vec4_t = obj.transform.scale;
2024-03-13 23:50:11 +01:00
2024-08-05 23:24:40 +02:00
let positions: i16_array_t = mesh_data_get_vertex_array(data, "pos").values;
let indices: u32_array_t[] = data._.indices;
let indices0: u32_array_t = indices[0];
2025-02-28 18:27:40 +01:00
scale_pos = scale.x * data.scale_pos;
posa = positions;
inda = indices0;
// triangles = f32_array_create(indices0.length * 3);
// let ar: u32_array_t = indices[0];
// for (let i: i32 = 0; i < math_floor(ar.length / 3); ++i) {
// triangles[i * 9 ] = positions[ar[i * 3 ] * 4 ] * sx;
// triangles[i * 9 + 1] = positions[ar[i * 3 ] * 4 + 1] * sy;
// triangles[i * 9 + 2] = positions[ar[i * 3 ] * 4 + 2] * sz;
// triangles[i * 9 + 3] = positions[ar[i * 3 + 1] * 4 ] * sx;
// triangles[i * 9 + 4] = positions[ar[i * 3 + 1] * 4 + 1] * sy;
// triangles[i * 9 + 5] = positions[ar[i * 3 + 1] * 4 + 2] * sz;
// triangles[i * 9 + 6] = positions[ar[i * 3 + 2] * 4 ] * sx;
// triangles[i * 9 + 7] = positions[ar[i * 3 + 2] * 4 + 1] * sy;
// triangles[i * 9 + 8] = positions[ar[i * 3 + 2] * 4 + 2] * sz;
2024-08-05 23:24:40 +02:00
// }
}
let loc: vec4_t = obj.transform.loc;
2025-02-28 18:27:40 +01:00
body._body = asim_body_create(body.shape, body.mass, body.dimx, body.dimy, body.dimz, loc.x, loc.y, loc.z, posa, inda, scale_pos);
2024-03-13 23:50:11 +01:00
}
2024-12-04 19:20:49 +01:00
function physics_body_remove(uid: i32) {
let body: physics_body_t = map_get(physics_body_object_map, uid);
if (body == null) {
return;
}
map_delete(physics_body_object_map, uid);
2025-02-28 18:27:40 +01:00
asim_body_remove(body._body);
2024-12-04 19:20:49 +01:00
}
2024-08-02 20:41:11 +02:00
function physics_body_apply_impulse(body: physics_body_t, dir: vec4_t) {
2025-02-28 18:27:40 +01:00
asim_body_apply_impulse(body._body, dir.x, dir.y, dir.z);
2024-03-13 23:50:11 +01:00
}
2024-08-02 20:41:11 +02:00
function physics_body_sync_transform(body: physics_body_t) {
2024-11-29 12:54:02 +01:00
let transform: transform_t = body.obj.transform;
2025-02-28 18:27:40 +01:00
asim_body_sync_transform(body._body, transform.loc, transform.rot);
2024-08-05 23:24:40 +02:00
}
2024-03-13 23:50:11 +01:00
2024-08-05 23:24:40 +02:00
function physics_body_update(body: physics_body_t) {
2025-02-28 18:27:40 +01:00
if (body.shape == physics_shape_t.MESH) {
return; ////
}
2024-08-05 23:24:40 +02:00
let transform: transform_t = body.obj.transform;
2025-02-28 18:27:40 +01:00
asim_body_get_pos(body._body, ADDRESS(transform.loc));
asim_body_get_rot(body._body, ADDRESS(transform.rot));
2024-08-05 23:24:40 +02:00
transform_build_matrix(transform);
2024-03-13 23:50:11 +01:00
}
///end