Make jolt physics work
This commit is contained in:
@@ -82,7 +82,7 @@ function gizmo_update() {
|
||||
|
||||
transform_build_matrix(paint_object.transform);
|
||||
///if arm_physics
|
||||
let pb: physics_body_t = map_get(physics_body_object_map, paint_object);
|
||||
let pb: physics_body_t = map_get(physics_body_object_map, paint_object.uid);
|
||||
if (pb != null) {
|
||||
physics_body_sync_transform(pb);
|
||||
}
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
|
||||
///if arm_physics
|
||||
|
||||
|
||||
|
||||
///end
|
||||
@@ -1,35 +1,90 @@
|
||||
|
||||
///if arm_physics
|
||||
|
||||
///include <phys_jolt.h>
|
||||
|
||||
declare function jolt_body_create(shape: i32, mass: f32, dimx: f32, x: f32, y: f32, z: f32, triangles: f32[]): any;
|
||||
declare function jolt_body_apply_impulse(body: any, x: f32, y: f32, z: f32): void;
|
||||
declare function jolt_body_get_pos(body: any, pos: vec4_t): void;
|
||||
declare function jolt_body_get_rot(body: any, rot: quat_t): void;
|
||||
|
||||
type physics_body_t = {
|
||||
shape: physics_shape_t;
|
||||
_body?: any;
|
||||
shape?: physics_shape_t;
|
||||
mass?: f32;
|
||||
dimx?: f32;
|
||||
obj?: object_t;
|
||||
};
|
||||
|
||||
enum physics_shape_t {
|
||||
SPHERE = 0,
|
||||
MESH = 1,
|
||||
SPHERE = 0,
|
||||
MESH = 1,
|
||||
}
|
||||
|
||||
let physics_body_object_map: map_t<any, any>;
|
||||
let physics_body_object_map: map_t<i32, physics_body_t> = map_create();
|
||||
|
||||
function physics_body_create(): physics_body_t {
|
||||
return null;
|
||||
let body: physics_body_t = {};
|
||||
return body;
|
||||
}
|
||||
|
||||
function physics_body_init(body: physics_body_t, obj: obj_t) {
|
||||
function physics_body_init(body: physics_body_t, obj: object_t) {
|
||||
map_set(physics_body_object_map, obj.uid, body);
|
||||
|
||||
}
|
||||
body.obj = obj;
|
||||
body.dimx = obj.transform.dim.x;
|
||||
|
||||
function physics_body_set_mass(body: physics_body_t, mass: f32) {
|
||||
let triangles: f32[] = null;
|
||||
if (body.shape == physics_shape_t.MESH) {
|
||||
let mo: mesh_object_t = obj.ext;
|
||||
let data: mesh_data_t = mo.data;
|
||||
let scale: vec4_t = obj.transform.scale;
|
||||
|
||||
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];
|
||||
let sx: f32 = scale.x * (1 / 32767);
|
||||
let sy: f32 = scale.y * (1 / 32767);
|
||||
let sz: f32 = scale.z * (1 / 32767);
|
||||
sx *= data.scale_pos;
|
||||
sy *= data.scale_pos;
|
||||
sz *= data.scale_pos;
|
||||
|
||||
triangles = f32_array_create(indices0.length * 3);
|
||||
|
||||
// for (let i: i32 = 0; i < indices.length; ++i) {
|
||||
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;
|
||||
}
|
||||
// }
|
||||
}
|
||||
|
||||
let loc: vec4_t = obj.transform.loc;
|
||||
body._body = jolt_body_create(body.shape, body.mass, body.dimx, loc.x, loc.y, loc.z, triangles);
|
||||
}
|
||||
|
||||
function physics_body_apply_impulse(body: physics_body_t, dir: vec4_t) {
|
||||
|
||||
jolt_body_apply_impulse(body._body, dir.x, dir.y, dir.z);
|
||||
}
|
||||
|
||||
function physics_body_sync_transform(body: physics_body_t) {
|
||||
//
|
||||
}
|
||||
|
||||
function physics_body_update(body: physics_body_t) {
|
||||
let transform: transform_t = body.obj.transform;
|
||||
jolt_body_get_pos(body._body, transform.loc);
|
||||
jolt_body_get_rot(body._body, transform.rot);
|
||||
transform_build_matrix(transform);
|
||||
}
|
||||
|
||||
///end
|
||||
|
||||
@@ -1,26 +1,52 @@
|
||||
|
||||
///if arm_physics
|
||||
|
||||
type physics_world_t = {
|
||||
empty: i32;
|
||||
///include <phys_jolt.h>
|
||||
|
||||
declare function jolt_world_create(): void;
|
||||
declare function jolt_world_update(): void;
|
||||
declare function jolt_world_get_contact_pairs(): physics_pair_t; // []
|
||||
declare function jolt_world_destroy(): void;
|
||||
declare type physics_pair_t = {
|
||||
pos_a_x: f32;
|
||||
pos_a_y: f32;
|
||||
pos_a_z: f32;
|
||||
};
|
||||
|
||||
type physics_pair_t = {
|
||||
pos_a: vec4_t;
|
||||
type physics_world_t = {
|
||||
empty?: i32;
|
||||
};
|
||||
|
||||
let physics_world_active: physics_world_t;
|
||||
|
||||
function physics_world_create() {
|
||||
|
||||
function physics_world_create(): physics_world_t {
|
||||
jolt_world_create();
|
||||
let world: physics_world_t = {};
|
||||
physics_world_active = world;
|
||||
return world;
|
||||
}
|
||||
|
||||
function physics_world_update(world: physics_world_t) {
|
||||
jolt_world_update();
|
||||
|
||||
let keys: i32[] = imap_keys(physics_body_object_map);
|
||||
for (let i: i32 = 0; i < keys.length; ++i) {
|
||||
let body: physics_body_t = map_get(physics_body_object_map, keys[i]);
|
||||
physics_body_update(body);
|
||||
}
|
||||
}
|
||||
|
||||
function physics_world_get_contact_pairs(world: physics_world_t, body: physics_body_t): physics_pair_t[] {
|
||||
return null;
|
||||
let pairs: physics_pair_t[] = [];
|
||||
let p: physics_pair_t = jolt_world_get_contact_pairs();
|
||||
array_push(pairs, p);
|
||||
return pairs;
|
||||
}
|
||||
|
||||
function physics_world_destroy() {
|
||||
if (physics_world_active != null) {
|
||||
jolt_world_destroy();
|
||||
}
|
||||
}
|
||||
|
||||
///end
|
||||
|
||||
+7
-11
@@ -857,12 +857,8 @@ function ui_base_update() {
|
||||
|
||||
let body: physics_body_t = physics_body_create();
|
||||
body.shape = physics_shape_t.SPHERE;
|
||||
physics_body_set_mass(body, 1.0);
|
||||
// body.ccd = true;
|
||||
mo.base.transform.radius /= 10; // Lower ccd radius
|
||||
body.mass = 1.0;
|
||||
physics_body_init(body, mo.base);
|
||||
map_set(physics_body_object_map, mo.base, body);
|
||||
mo.base.transform.radius *= 10;
|
||||
|
||||
let ray: ray_t = raycast_get_ray(mouse_view_x(), mouse_view_y(), camera);
|
||||
physics_body_apply_impulse(body, vec4_mult(ray.dir, 0.15));
|
||||
@@ -876,12 +872,12 @@ function ui_base_update() {
|
||||
if (pairs != null) {
|
||||
for (let i: i32 = 0; i < pairs.length; ++i) {
|
||||
let p: physics_pair_t = pairs[i];
|
||||
context_raw.last_particle_hit_x = context_raw.particle_hit_x != 0 ? context_raw.particle_hit_x : p.pos_a.x;
|
||||
context_raw.last_particle_hit_y = context_raw.particle_hit_y != 0 ? context_raw.particle_hit_y : p.pos_a.y;
|
||||
context_raw.last_particle_hit_z = context_raw.particle_hit_z != 0 ? context_raw.particle_hit_z : p.pos_a.z;
|
||||
context_raw.particle_hit_x = p.pos_a.x;
|
||||
context_raw.particle_hit_y = p.pos_a.y;
|
||||
context_raw.particle_hit_z = p.pos_a.z;
|
||||
context_raw.last_particle_hit_x = context_raw.particle_hit_x != 0 ? context_raw.particle_hit_x : p.pos_a_x;
|
||||
context_raw.last_particle_hit_y = context_raw.particle_hit_y != 0 ? context_raw.particle_hit_y : p.pos_a_y;
|
||||
context_raw.last_particle_hit_z = context_raw.particle_hit_z != 0 ? context_raw.particle_hit_z : p.pos_a_z;
|
||||
context_raw.particle_hit_x = p.pos_a_x;
|
||||
context_raw.particle_hit_y = p.pos_a_y;
|
||||
context_raw.particle_hit_z = p.pos_a_z;
|
||||
context_raw.pdirty = 1;
|
||||
break; // 1 pair for now
|
||||
}
|
||||
|
||||
@@ -77,6 +77,8 @@ function util_particle_init() {
|
||||
let mo: mesh_object_t = o.ext;
|
||||
mo.base.name = ".ParticleEmitter";
|
||||
mo.base.raw = util_clone_obj(mo.base.raw);
|
||||
let oraw: obj_t = mo.base.raw;
|
||||
oraw.particles = {};
|
||||
mo.base.raw.particles.refs = particle_refs;
|
||||
///if arm_particles
|
||||
mesh_object_setup_particle_system(mo, "Scene", particle_refs[0]);
|
||||
@@ -109,7 +111,6 @@ function util_particle_init_mesh() {
|
||||
context_raw.paint_body = physics_body_create();
|
||||
context_raw.paint_body.shape = physics_shape_t.MESH;
|
||||
physics_body_init(context_raw.paint_body, po.base);
|
||||
map_set(physics_body_object_map, po.base, context_raw.paint_body);
|
||||
}
|
||||
|
||||
///end
|
||||
|
||||
Reference in New Issue
Block a user