}
PhysicsBody :: struct {
- pos: Vector3;
- vel: Vector3;
- acc: Vector3;
+ pos: Vector3;
+ vel: Vector3;
+ acc: Vector3;
on_ground := false;
}
physics_simulate :: (use body: ^PhysicsBody, dt: f32, world: ^World) {
- aabb_buffer := (cast(^AABB) alloc.from_stack(sizeof [64] AABB))[0..64];
+ aabb_buffer := (cast(^AABB) alloc.from_stack(sizeof [128] AABB))[0..128];
- aabbs := world_get_aabbs(world, pos, 3, aabb_buffer);
+ aabbs := world_get_aabbs(world, pos, 3, aabb_buffer);
vel += acc * dt;
- try_move :: macro (delta: Vector3) -> bool {
+ try_move :: macro (delta: Vector3) -> f32 {
new_pos := body.pos + delta;
body_aabb := get_collision_object(new_pos);
for^ aabbs {
if AABB.intersects(body_aabb, *it) {
if delta.y < 0 do on_ground = true;
- return false;
+ return 0;
}
}
- return true;
+ return 1;
}
on_ground = false;
move_y := try_move(.{0, vel.y * dt, 0});
move_z := try_move(.{0, 0, vel.z * dt});
- if on_ground do vel.y = 0;
+ pos.x += vel.x * dt * move_x;
+ pos.y += vel.y * dt * move_y;
+ pos.z += vel.z * dt * move_z;
- if move_x do pos.x += vel.x * dt;
- if move_y do pos.y += vel.y * dt;
- if move_z do pos.z += vel.z * dt;
+ if on_ground do vel.y = 0;
}