Skip to content

Commit 4f288b1

Browse files
committed
optimize physics a bit more
1 parent e47dee3 commit 4f288b1

File tree

7 files changed

+176
-157
lines changed

7 files changed

+176
-157
lines changed

azalea-core/src/cursor3d.rs

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@ use crate::position::BlockPos;
33
pub struct Cursor3d {
44
index: usize,
55

6-
origin_x: i32,
7-
origin_y: i32,
8-
origin_z: i32,
6+
origin: BlockPos,
97

108
width: usize,
119
height: usize,
@@ -14,6 +12,12 @@ pub struct Cursor3d {
1412
end: usize,
1513
}
1614

15+
impl Cursor3d {
16+
pub fn origin(&self) -> BlockPos {
17+
self.origin
18+
}
19+
}
20+
1721
impl Iterator for Cursor3d {
1822
type Item = CursorIteration;
1923

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

4145
Some(CursorIteration {
4246
pos: BlockPos {
43-
x: self.origin_x + x as i32,
44-
y: self.origin_y + y as i32,
45-
z: self.origin_z + z as i32,
47+
x: self.origin.x + x as i32,
48+
y: self.origin.y + y as i32,
49+
z: self.origin.z + z as i32,
4650
},
4751
iteration_type: iteration_type.into(),
4852
})
@@ -64,30 +68,21 @@ pub struct CursorIteration {
6468
}
6569

6670
impl Cursor3d {
67-
pub fn new(
68-
origin_x: i32,
69-
origin_y: i32,
70-
origin_z: i32,
71-
end_x: i32,
72-
end_y: i32,
73-
end_z: i32,
74-
) -> Self {
75-
let width = (end_x - origin_x + 1)
71+
pub fn new(origin: BlockPos, end: BlockPos) -> Self {
72+
let width = (end.x - origin.x + 1)
7673
.try_into()
7774
.expect("Impossible width.");
78-
let height = (end_y - origin_y + 1)
75+
let height = (end.y - origin.y + 1)
7976
.try_into()
8077
.expect("Impossible height.");
81-
let depth = (end_z - origin_z + 1)
78+
let depth = (end.z - origin.z + 1)
8279
.try_into()
8380
.expect("Impossible depth.");
8481

8582
Self {
8683
index: 0,
8784

88-
origin_x,
89-
origin_y,
90-
origin_z,
85+
origin,
9186

9287
width,
9388
height,

azalea-entity/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ pub struct PlayerBundle {
410410
/// be updated by other clients.
411411
///
412412
/// If this is for a client then all of our clients will have this.
413-
#[derive(Component)]
413+
#[derive(Component, Clone)]
414414
pub struct LocalEntity;
415415

416416
#[derive(Component, Clone, Debug, PartialEq, Deref, DerefMut)]

azalea-physics/src/collision/mergers.rs

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::cmp::Ordering;
1+
use std::cmp::{self, Ordering};
22

33
use super::CubePointRange;
44
use azalea_core::math::{gcd, lcm, EPSILON};
@@ -135,27 +135,27 @@ impl IndexMerger {
135135
}
136136
}
137137

138-
pub fn new_indirect(var1: &[f64], var2: &[f64], var3: bool, var4: bool) -> Self {
138+
pub fn new_indirect(coords1: &[f64], coords2: &[f64], var3: bool, var4: bool) -> Self {
139139
let mut var5 = f64::NAN;
140-
let var7 = var1.len();
141-
let var8 = var2.len();
142-
let var9 = var7 + var8;
143-
let mut result = vec![0.0; var9];
144-
let mut first_indices: Vec<isize> = vec![0; var9];
145-
let mut second_indices: Vec<isize> = vec![0; var9];
140+
let coords1_len = coords1.len();
141+
let coords2_len = coords2.len();
142+
let number_of_indices = coords1_len + coords2_len;
143+
let mut result = vec![0.0; number_of_indices];
144+
let mut first_indices: Vec<isize> = vec![0; number_of_indices];
145+
let mut second_indices: Vec<isize> = vec![0; number_of_indices];
146146
let var10 = !var3;
147147
let var11 = !var4;
148148
let mut var12 = 0;
149-
let mut var13 = 0;
150-
let mut var14 = 0;
149+
let mut coords1_index = 0;
150+
let mut coords2_index = 0;
151151

152152
loop {
153-
let mut var17: bool;
153+
let mut iterating_coords1: bool;
154154
loop {
155-
let var15 = var13 >= var7;
156-
let var16 = var14 >= var8;
157-
if var15 && var16 {
158-
let result_length = std::cmp::max(1, var12);
155+
let at_end_of_coords1 = coords1_index >= coords1_len;
156+
let at_end_of_coords2 = coords2_index >= coords2_len;
157+
if at_end_of_coords1 && at_end_of_coords2 {
158+
let result_length = cmp::max(1, var12);
159159
return Self::Indirect {
160160
result,
161161
first_indices,
@@ -164,26 +164,28 @@ impl IndexMerger {
164164
};
165165
}
166166

167-
var17 = !var15 && (var16 || var1[var13] < var2[var14] + EPSILON);
168-
if var17 {
169-
var13 += 1;
170-
if !var10 || var14 != 0 && !var16 {
167+
iterating_coords1 = !at_end_of_coords1
168+
&& (at_end_of_coords2
169+
|| coords1[coords1_index] < coords2[coords2_index] + EPSILON);
170+
if iterating_coords1 {
171+
coords1_index += 1;
172+
if !var10 || coords2_index != 0 && !at_end_of_coords2 {
171173
break;
172174
}
173175
} else {
174-
var14 += 1;
175-
if !var11 || var13 != 0 && !var15 {
176+
coords2_index += 1;
177+
if !var11 || coords1_index != 0 && !at_end_of_coords1 {
176178
break;
177179
}
178180
}
179181
}
180182

181-
let var18: isize = (var13 as isize) - 1;
182-
let var19: isize = (var14 as isize) - 1;
183-
let var20 = if var17 {
184-
var1[TryInto::<usize>::try_into(var18).unwrap()]
183+
let var18: isize = (coords1_index as isize) - 1;
184+
let var19: isize = (coords2_index as isize) - 1;
185+
let var20 = if iterating_coords1 {
186+
coords1[usize::try_from(var18).unwrap()]
185187
} else {
186-
var2[TryInto::<usize>::try_into(var19).unwrap()]
188+
coords2[usize::try_from(var19).unwrap()]
187189
};
188190
match var5.partial_cmp(&(var20 - EPSILON)) {
189191
None | Some(Ordering::Less) => {

azalea-physics/src/collision/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,6 @@ fn collide_bounding_box(
266266

267267
let block_collisions =
268268
get_block_collisions(world, entity_bounding_box.expand_towards(movement));
269-
let block_collisions = block_collisions.collect::<Vec<_>>();
270269
collision_boxes.extend(block_collisions);
271270
collide_with_shapes(movement, *entity_bounding_box, &collision_boxes)
272271
}

azalea-physics/src/collision/shape.rs

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -169,22 +169,22 @@ impl Shapes {
169169
// var5.getList(), var6.getList(), var7.getList()));
170170
let var5 = Self::create_index_merger(
171171
1,
172-
a.get_coords(Axis::X).to_vec(),
173-
b.get_coords(Axis::X).to_vec(),
172+
a.get_coords(Axis::X),
173+
b.get_coords(Axis::X),
174174
op_true_false,
175175
op_false_true,
176176
);
177177
let var6 = Self::create_index_merger(
178178
(var5.size() - 1).try_into().unwrap(),
179-
a.get_coords(Axis::Y).to_vec(),
180-
b.get_coords(Axis::Y).to_vec(),
179+
a.get_coords(Axis::Y),
180+
b.get_coords(Axis::Y),
181181
op_true_false,
182182
op_false_true,
183183
);
184184
let var7 = Self::create_index_merger(
185185
((var5.size() - 1) * (var6.size() - 1)).try_into().unwrap(),
186-
a.get_coords(Axis::Z).to_vec(),
187-
b.get_coords(Axis::Z).to_vec(),
186+
a.get_coords(Axis::Z),
187+
b.get_coords(Axis::Z),
188188
op_true_false,
189189
op_false_true,
190190
);
@@ -208,8 +208,12 @@ impl Shapes {
208208

209209
/// Check if the op is true anywhere when joining the two shapes
210210
/// vanilla calls this joinIsNotEmpty
211-
pub fn matches_anywhere(a: &VoxelShape, b: &VoxelShape, op: fn(bool, bool) -> bool) -> bool {
212-
assert!(!op(false, false));
211+
pub fn matches_anywhere(
212+
a: &VoxelShape,
213+
b: &VoxelShape,
214+
op: impl Fn(bool, bool) -> bool,
215+
) -> bool {
216+
debug_assert!(!op(false, false));
213217
let a_is_empty = a.is_empty();
214218
let b_is_empty = b.is_empty();
215219
if a_is_empty || b_is_empty {
@@ -233,22 +237,22 @@ impl Shapes {
233237

234238
let x_merger = Self::create_index_merger(
235239
1,
236-
a.get_coords(Axis::X).to_vec(),
237-
b.get_coords(Axis::X).to_vec(),
240+
a.get_coords(Axis::X),
241+
b.get_coords(Axis::X),
238242
op_true_false,
239243
op_false_true,
240244
);
241245
let y_merger = Self::create_index_merger(
242246
(x_merger.size() - 1) as i32,
243-
a.get_coords(Axis::Y).to_vec(),
244-
b.get_coords(Axis::Y).to_vec(),
247+
a.get_coords(Axis::Y),
248+
b.get_coords(Axis::Y),
245249
op_true_false,
246250
op_false_true,
247251
);
248252
let z_merger = Self::create_index_merger(
249253
((x_merger.size() - 1) * (y_merger.size() - 1)) as i32,
250-
a.get_coords(Axis::Z).to_vec(),
251-
b.get_coords(Axis::Z).to_vec(),
254+
a.get_coords(Axis::Z),
255+
b.get_coords(Axis::Z),
252256
op_true_false,
253257
op_false_true,
254258
);
@@ -269,7 +273,7 @@ impl Shapes {
269273
merged_z: IndexMerger,
270274
shape1: DiscreteVoxelShape,
271275
shape2: DiscreteVoxelShape,
272-
op: fn(bool, bool) -> bool,
276+
op: impl Fn(bool, bool) -> bool,
273277
) -> bool {
274278
!merged_x.for_merged_indexes(|var5x, var6, _var7| {
275279
merged_y.for_merged_indexes(|var6x, var7x, _var8| {
@@ -285,13 +289,13 @@ impl Shapes {
285289

286290
pub fn create_index_merger(
287291
_var0: i32,
288-
var1: Vec<f64>,
289-
var2: Vec<f64>,
292+
coords1: &[f64],
293+
coords2: &[f64],
290294
var3: bool,
291295
var4: bool,
292296
) -> IndexMerger {
293-
let var5 = var1.len() - 1;
294-
let var6 = var2.len() - 1;
297+
let var5 = coords1.len() - 1;
298+
let var6 = coords2.len() - 1;
295299
// if (&var1 as &dyn Any).is::<CubePointRange>() && (&var2 as &dyn
296300
// Any).is::<CubePointRange>() {
297301
// return new DiscreteCubeMerger(var0, var5, var6, var3, var4);
@@ -302,22 +306,24 @@ impl Shapes {
302306
// }
303307
// }
304308

305-
if var1[var5] < var2[0] - EPSILON {
309+
if coords1[var5] < coords2[0] - EPSILON {
306310
IndexMerger::NonOverlapping {
307-
lower: var1,
308-
upper: var2,
311+
lower: coords1.to_vec(),
312+
upper: coords2.to_vec(),
309313
swap: false,
310314
}
311-
} else if var2[var6] < var1[0] - EPSILON {
315+
} else if coords2[var6] < coords1[0] - EPSILON {
312316
IndexMerger::NonOverlapping {
313-
lower: var2,
314-
upper: var1,
317+
lower: coords2.to_vec(),
318+
upper: coords1.to_vec(),
315319
swap: true,
316320
}
317-
} else if var5 == var6 && var1 == var2 {
318-
IndexMerger::Identical { coords: var1 }
321+
} else if var5 == var6 && coords1 == coords2 {
322+
IndexMerger::Identical {
323+
coords: coords1.to_vec(),
324+
}
319325
} else {
320-
IndexMerger::new_indirect(&var1, &var2, var3, var4)
326+
IndexMerger::new_indirect(&coords1, &coords2, var3, var4)
321327
}
322328
}
323329
}
@@ -386,6 +392,7 @@ impl VoxelShape {
386392
))
387393
}
388394

395+
#[inline]
389396
pub fn get(&self, axis: Axis, index: usize) -> f64 {
390397
// self.get_coords(axis)[index]
391398
match self {
@@ -403,9 +410,8 @@ impl VoxelShape {
403410
match self {
404411
VoxelShape::Cube(s) => s.find_index(axis, coord),
405412
_ => {
406-
binary_search(0, (self.shape().size(axis) + 1) as i32, &|t| {
407-
coord < self.get(axis, t as usize)
408-
}) - 1
413+
let upper_limit = (self.shape().size(axis) + 1) as i32;
414+
binary_search(0, upper_limit, &|t| coord < self.get(axis, t as usize)) - 1
409415
}
410416
}
411417
}
@@ -657,6 +663,7 @@ impl ArrayVoxelShape {
657663
&self.shape
658664
}
659665

666+
#[inline]
660667
fn get_coords(&self, axis: Axis) -> &[f64] {
661668
axis.choose(&self.xs, &self.ys, &self.zs)
662669
}
@@ -693,6 +700,7 @@ impl CubeVoxelShape {
693700
parts
694701
}
695702

703+
#[inline]
696704
fn get_coords(&self, axis: Axis) -> &[f64] {
697705
axis.choose(&self.x_coords, &self.y_coords, &self.z_coords)
698706
}

0 commit comments

Comments
 (0)