From fd680eff51cc8719689fa20c9f5581ebb4f217ab Mon Sep 17 00:00:00 2001 From: luboslenco Date: Mon, 5 Aug 2024 23:24:40 +0200 Subject: [PATCH] Make jolt physics work --- base/sources/gizmo.ts | 2 +- base/sources/physics_api.ts | 6 --- base/sources/physics_body.ts | 73 ++++++++++++++++++++++++++++++----- base/sources/physics_world.ts | 40 +++++++++++++++---- base/sources/ui_base.ts | 18 ++++----- base/sources/util_particle.ts | 3 +- 6 files changed, 107 insertions(+), 35 deletions(-) delete mode 100644 base/sources/physics_api.ts diff --git a/base/sources/gizmo.ts b/base/sources/gizmo.ts index b5503537..8c0163d1 100644 --- a/base/sources/gizmo.ts +++ b/base/sources/gizmo.ts @@ -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); } diff --git a/base/sources/physics_api.ts b/base/sources/physics_api.ts deleted file mode 100644 index 52ef6828..00000000 --- a/base/sources/physics_api.ts +++ /dev/null @@ -1,6 +0,0 @@ - -///if arm_physics - - - -///end diff --git a/base/sources/physics_body.ts b/base/sources/physics_body.ts index 7d3eb3d1..93557150 100644 --- a/base/sources/physics_body.ts +++ b/base/sources/physics_body.ts @@ -1,35 +1,90 @@ ///if arm_physics +///include + +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; +let physics_body_object_map: map_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 diff --git a/base/sources/physics_world.ts b/base/sources/physics_world.ts index ddaf27de..a5bcecc3 100644 --- a/base/sources/physics_world.ts +++ b/base/sources/physics_world.ts @@ -1,26 +1,52 @@ ///if arm_physics -type physics_world_t = { - empty: i32; +///include + +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 diff --git a/base/sources/ui_base.ts b/base/sources/ui_base.ts index b1f63eda..f136e84e 100644 --- a/base/sources/ui_base.ts +++ b/base/sources/ui_base.ts @@ -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 } diff --git a/base/sources/util_particle.ts b/base/sources/util_particle.ts index bb8d9233..5f2e8f84 100644 --- a/base/sources/util_particle.ts +++ b/base/sources/util_particle.ts @@ -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