Skip to content

Commit

Permalink
optimize physics a bit more
Browse files Browse the repository at this point in the history
  • Loading branch information
mat-1 committed Feb 26, 2024
1 parent e47dee3 commit 4f288b1
Show file tree
Hide file tree
Showing 7 changed files with 176 additions and 157 deletions.
35 changes: 15 additions & 20 deletions azalea-core/src/cursor3d.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@ use crate::position::BlockPos;
pub struct Cursor3d {
index: usize,

origin_x: i32,
origin_y: i32,
origin_z: i32,
origin: BlockPos,

width: usize,
height: usize,
Expand All @@ -14,6 +12,12 @@ pub struct Cursor3d {
end: usize,
}

impl Cursor3d {
pub fn origin(&self) -> BlockPos {
self.origin
}
}

impl Iterator for Cursor3d {
type Item = CursorIteration;

Expand All @@ -40,9 +44,9 @@ impl Iterator for Cursor3d {

Some(CursorIteration {
pos: BlockPos {
x: self.origin_x + x as i32,
y: self.origin_y + y as i32,
z: self.origin_z + z as i32,
x: self.origin.x + x as i32,
y: self.origin.y + y as i32,
z: self.origin.z + z as i32,
},
iteration_type: iteration_type.into(),
})
Expand All @@ -64,30 +68,21 @@ pub struct CursorIteration {
}

impl Cursor3d {
pub fn new(
origin_x: i32,
origin_y: i32,
origin_z: i32,
end_x: i32,
end_y: i32,
end_z: i32,
) -> Self {
let width = (end_x - origin_x + 1)
pub fn new(origin: BlockPos, end: BlockPos) -> Self {
let width = (end.x - origin.x + 1)
.try_into()
.expect("Impossible width.");
let height = (end_y - origin_y + 1)
let height = (end.y - origin.y + 1)
.try_into()
.expect("Impossible height.");
let depth = (end_z - origin_z + 1)
let depth = (end.z - origin.z + 1)
.try_into()
.expect("Impossible depth.");

Self {
index: 0,

origin_x,
origin_y,
origin_z,
origin,

width,
height,
Expand Down
2 changes: 1 addition & 1 deletion azalea-entity/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -410,7 +410,7 @@ pub struct PlayerBundle {
/// be updated by other clients.
///
/// If this is for a client then all of our clients will have this.
#[derive(Component)]
#[derive(Component, Clone)]
pub struct LocalEntity;

#[derive(Component, Clone, Debug, PartialEq, Deref, DerefMut)]
Expand Down
54 changes: 28 additions & 26 deletions azalea-physics/src/collision/mergers.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use std::cmp::Ordering;
use std::cmp::{self, Ordering};

use super::CubePointRange;
use azalea_core::math::{gcd, lcm, EPSILON};
Expand Down Expand Up @@ -135,27 +135,27 @@ impl IndexMerger {
}
}

pub fn new_indirect(var1: &[f64], var2: &[f64], var3: bool, var4: bool) -> Self {
pub fn new_indirect(coords1: &[f64], coords2: &[f64], var3: bool, var4: bool) -> Self {
let mut var5 = f64::NAN;
let var7 = var1.len();
let var8 = var2.len();
let var9 = var7 + var8;
let mut result = vec![0.0; var9];
let mut first_indices: Vec<isize> = vec![0; var9];
let mut second_indices: Vec<isize> = vec![0; var9];
let coords1_len = coords1.len();
let coords2_len = coords2.len();
let number_of_indices = coords1_len + coords2_len;
let mut result = vec![0.0; number_of_indices];
let mut first_indices: Vec<isize> = vec![0; number_of_indices];
let mut second_indices: Vec<isize> = vec![0; number_of_indices];
let var10 = !var3;
let var11 = !var4;
let mut var12 = 0;
let mut var13 = 0;
let mut var14 = 0;
let mut coords1_index = 0;
let mut coords2_index = 0;

loop {
let mut var17: bool;
let mut iterating_coords1: bool;
loop {
let var15 = var13 >= var7;
let var16 = var14 >= var8;
if var15 && var16 {
let result_length = std::cmp::max(1, var12);
let at_end_of_coords1 = coords1_index >= coords1_len;
let at_end_of_coords2 = coords2_index >= coords2_len;
if at_end_of_coords1 && at_end_of_coords2 {
let result_length = cmp::max(1, var12);
return Self::Indirect {
result,
first_indices,
Expand All @@ -164,26 +164,28 @@ impl IndexMerger {
};
}

var17 = !var15 && (var16 || var1[var13] < var2[var14] + EPSILON);
if var17 {
var13 += 1;
if !var10 || var14 != 0 && !var16 {
iterating_coords1 = !at_end_of_coords1
&& (at_end_of_coords2
|| coords1[coords1_index] < coords2[coords2_index] + EPSILON);
if iterating_coords1 {
coords1_index += 1;
if !var10 || coords2_index != 0 && !at_end_of_coords2 {
break;
}
} else {
var14 += 1;
if !var11 || var13 != 0 && !var15 {
coords2_index += 1;
if !var11 || coords1_index != 0 && !at_end_of_coords1 {
break;
}
}
}

let var18: isize = (var13 as isize) - 1;
let var19: isize = (var14 as isize) - 1;
let var20 = if var17 {
var1[TryInto::<usize>::try_into(var18).unwrap()]
let var18: isize = (coords1_index as isize) - 1;
let var19: isize = (coords2_index as isize) - 1;
let var20 = if iterating_coords1 {
coords1[usize::try_from(var18).unwrap()]
} else {
var2[TryInto::<usize>::try_into(var19).unwrap()]
coords2[usize::try_from(var19).unwrap()]
};
match var5.partial_cmp(&(var20 - EPSILON)) {
None | Some(Ordering::Less) => {
Expand Down
1 change: 0 additions & 1 deletion azalea-physics/src/collision/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,6 @@ fn collide_bounding_box(

let block_collisions =
get_block_collisions(world, entity_bounding_box.expand_towards(movement));
let block_collisions = block_collisions.collect::<Vec<_>>();
collision_boxes.extend(block_collisions);
collide_with_shapes(movement, *entity_bounding_box, &collision_boxes)
}
Expand Down
70 changes: 39 additions & 31 deletions azalea-physics/src/collision/shape.rs
Original file line number Diff line number Diff line change
Expand Up @@ -169,22 +169,22 @@ impl Shapes {
// var5.getList(), var6.getList(), var7.getList()));
let var5 = Self::create_index_merger(
1,
a.get_coords(Axis::X).to_vec(),
b.get_coords(Axis::X).to_vec(),
a.get_coords(Axis::X),
b.get_coords(Axis::X),
op_true_false,
op_false_true,
);
let var6 = Self::create_index_merger(
(var5.size() - 1).try_into().unwrap(),
a.get_coords(Axis::Y).to_vec(),
b.get_coords(Axis::Y).to_vec(),
a.get_coords(Axis::Y),
b.get_coords(Axis::Y),
op_true_false,
op_false_true,
);
let var7 = Self::create_index_merger(
((var5.size() - 1) * (var6.size() - 1)).try_into().unwrap(),
a.get_coords(Axis::Z).to_vec(),
b.get_coords(Axis::Z).to_vec(),
a.get_coords(Axis::Z),
b.get_coords(Axis::Z),
op_true_false,
op_false_true,
);
Expand All @@ -208,8 +208,12 @@ impl Shapes {

/// Check if the op is true anywhere when joining the two shapes
/// vanilla calls this joinIsNotEmpty
pub fn matches_anywhere(a: &VoxelShape, b: &VoxelShape, op: fn(bool, bool) -> bool) -> bool {
assert!(!op(false, false));
pub fn matches_anywhere(
a: &VoxelShape,
b: &VoxelShape,
op: impl Fn(bool, bool) -> bool,
) -> bool {
debug_assert!(!op(false, false));
let a_is_empty = a.is_empty();
let b_is_empty = b.is_empty();
if a_is_empty || b_is_empty {
Expand All @@ -233,22 +237,22 @@ impl Shapes {

let x_merger = Self::create_index_merger(
1,
a.get_coords(Axis::X).to_vec(),
b.get_coords(Axis::X).to_vec(),
a.get_coords(Axis::X),
b.get_coords(Axis::X),
op_true_false,
op_false_true,
);
let y_merger = Self::create_index_merger(
(x_merger.size() - 1) as i32,
a.get_coords(Axis::Y).to_vec(),
b.get_coords(Axis::Y).to_vec(),
a.get_coords(Axis::Y),
b.get_coords(Axis::Y),
op_true_false,
op_false_true,
);
let z_merger = Self::create_index_merger(
((x_merger.size() - 1) * (y_merger.size() - 1)) as i32,
a.get_coords(Axis::Z).to_vec(),
b.get_coords(Axis::Z).to_vec(),
a.get_coords(Axis::Z),
b.get_coords(Axis::Z),
op_true_false,
op_false_true,
);
Expand All @@ -269,7 +273,7 @@ impl Shapes {
merged_z: IndexMerger,
shape1: DiscreteVoxelShape,
shape2: DiscreteVoxelShape,
op: fn(bool, bool) -> bool,
op: impl Fn(bool, bool) -> bool,
) -> bool {
!merged_x.for_merged_indexes(|var5x, var6, _var7| {
merged_y.for_merged_indexes(|var6x, var7x, _var8| {
Expand All @@ -285,13 +289,13 @@ impl Shapes {

pub fn create_index_merger(
_var0: i32,
var1: Vec<f64>,
var2: Vec<f64>,
coords1: &[f64],
coords2: &[f64],
var3: bool,
var4: bool,
) -> IndexMerger {
let var5 = var1.len() - 1;
let var6 = var2.len() - 1;
let var5 = coords1.len() - 1;
let var6 = coords2.len() - 1;
// if (&var1 as &dyn Any).is::<CubePointRange>() && (&var2 as &dyn
// Any).is::<CubePointRange>() {
// return new DiscreteCubeMerger(var0, var5, var6, var3, var4);
Expand All @@ -302,22 +306,24 @@ impl Shapes {
// }
// }

if var1[var5] < var2[0] - EPSILON {
if coords1[var5] < coords2[0] - EPSILON {
IndexMerger::NonOverlapping {
lower: var1,
upper: var2,
lower: coords1.to_vec(),
upper: coords2.to_vec(),
swap: false,
}
} else if var2[var6] < var1[0] - EPSILON {
} else if coords2[var6] < coords1[0] - EPSILON {
IndexMerger::NonOverlapping {
lower: var2,
upper: var1,
lower: coords2.to_vec(),
upper: coords1.to_vec(),
swap: true,
}
} else if var5 == var6 && var1 == var2 {
IndexMerger::Identical { coords: var1 }
} else if var5 == var6 && coords1 == coords2 {
IndexMerger::Identical {
coords: coords1.to_vec(),
}
} else {
IndexMerger::new_indirect(&var1, &var2, var3, var4)
IndexMerger::new_indirect(&coords1, &coords2, var3, var4)

Check warning on line 326 in azalea-physics/src/collision/shape.rs

View workflow job for this annotation

GitHub Actions / clippy

this expression creates a reference which is immediately dereferenced by the compiler

warning: this expression creates a reference which is immediately dereferenced by the compiler --> azalea-physics/src/collision/shape.rs:326:49 | 326 | IndexMerger::new_indirect(&coords1, &coords2, var3, var4) | ^^^^^^^^ help: change this to: `coords2` | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow

Check warning on line 326 in azalea-physics/src/collision/shape.rs

View workflow job for this annotation

GitHub Actions / clippy

this expression creates a reference which is immediately dereferenced by the compiler

warning: this expression creates a reference which is immediately dereferenced by the compiler --> azalea-physics/src/collision/shape.rs:326:39 | 326 | IndexMerger::new_indirect(&coords1, &coords2, var3, var4) | ^^^^^^^^ help: change this to: `coords1` | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow = note: `#[warn(clippy::needless_borrow)]` on by default
}
}
}
Expand Down Expand Up @@ -386,6 +392,7 @@ impl VoxelShape {
))
}

#[inline]
pub fn get(&self, axis: Axis, index: usize) -> f64 {
// self.get_coords(axis)[index]
match self {
Expand All @@ -403,9 +410,8 @@ impl VoxelShape {
match self {
VoxelShape::Cube(s) => s.find_index(axis, coord),
_ => {
binary_search(0, (self.shape().size(axis) + 1) as i32, &|t| {
coord < self.get(axis, t as usize)
}) - 1
let upper_limit = (self.shape().size(axis) + 1) as i32;
binary_search(0, upper_limit, &|t| coord < self.get(axis, t as usize)) - 1
}
}
}
Expand Down Expand Up @@ -657,6 +663,7 @@ impl ArrayVoxelShape {
&self.shape
}

#[inline]
fn get_coords(&self, axis: Axis) -> &[f64] {
axis.choose(&self.xs, &self.ys, &self.zs)
}
Expand Down Expand Up @@ -693,6 +700,7 @@ impl CubeVoxelShape {
parts
}

#[inline]
fn get_coords(&self, axis: Axis) -> &[f64] {
axis.choose(&self.x_coords, &self.y_coords, &self.z_coords)
}
Expand Down
Loading

0 comments on commit 4f288b1

Please sign in to comment.