while camera.y_rot < 0 do camera.y_rot += 2 * math.PI;
camera.x_rot = math.clamp(camera.x_rot, -math.PI / 2 + 0.01, math.PI / 2 - 0.01);
- body.vel = .{0,body.vel.y,0};
-
forward := camera_get_forward(camera);
facing := forward;
facing.y = 0;
facing = Vector3.norm(facing);
- if is_key_down(GLFW_KEY_W) {
- body.vel += facing * speed;
- }
- if is_key_down(GLFW_KEY_S) {
- body.vel -= facing * speed;
- }
- if is_key_down(GLFW_KEY_D) {
- body.vel += Vector3.norm(Vector3.cross(facing, .{0,1,0})) * speed;
- }
- if is_key_down(GLFW_KEY_A) {
- body.vel -= Vector3.norm(Vector3.cross(facing, .{0,1,0})) * speed;
- }
+
+ xz_vel := Vector3.{0,0,0};
+ if is_key_down(GLFW_KEY_W) do xz_vel += facing;
+ if is_key_down(GLFW_KEY_S) do xz_vel -= facing;
+ if is_key_down(GLFW_KEY_D) do xz_vel += Vector3.norm(Vector3.cross(facing, .{0,1,0}));
+ if is_key_down(GLFW_KEY_A) do xz_vel -= Vector3.norm(Vector3.cross(facing, .{0,1,0}));
+
+ if Vector3.mag(xz_vel) > 0 do xz_vel = Vector3.norm(xz_vel) * speed;
+ body.vel.x = xz_vel.x;
+ body.vel.z = xz_vel.z;
physics_apply_gravity(^body);
camera.position = body.pos;
+ ray_cast_to_block :: (_, p) => world_get_block(world, p.x, p.y, p.z) != Block_Empty;
+
dir: Vector3i;
- if !ray_cast(.{ camera.position, forward }, 10, null, (_, p) => {
- return world_get_block(world, p.x, p.y, p.z) != Block_Empty;
- }, ^selected_block, ^dir) {
+ if !ray_cast(.{ camera.position, forward }, 10, null, ray_cast_to_block, ^selected_block, ^dir) {
selected_block = .{0,0,0};
}
player_get_aabb :: (pos: Vector3) -> AABB {
return .{
- x0 = pos.x - 0.25f,
+ x0 = pos.x - 0.3f,
y0 = pos.y - 1.8f,
- z0 = pos.z - 0.25f,
- x1 = pos.x + 0.25f,
+ z0 = pos.z - 0.3f,
+ x1 = pos.x + 0.3f,
y1 = pos.y + 0.1f,
- z1 = pos.z + 0.25f,
+ z1 = pos.z + 0.3f,
};
}