aboutsummaryrefslogtreecommitdiff
path: root/azalea-core/src/direction.rs
diff options
context:
space:
mode:
authormat <27899617+mat-1@users.noreply.github.com>2022-08-29 20:41:01 -0500
committerGitHub <noreply@github.com>2022-08-29 20:41:01 -0500
commitf42d630544165d11a544224ac273d6aaf89d8095 (patch)
tree94bd73771ecb582d89a87cdca8e21b2d6573ef12 /azalea-core/src/direction.rs
parent2ea804401f54a45765860201d10d0569d07862ec (diff)
downloadazalea-drasl-f42d630544165d11a544224ac273d6aaf89d8095.tar.xz
Physics (#11)
* Put physics module in azalea-entity * port aabb * add more stuff to PositionXYZ * azalea-physics * important collision things * more physics stuff * backup because i'm about to delete shapes * more shape stuff * CubeVoxelShape * no compile errors??? insane * impl VoxelShape for ArrayVoxelShape * Shapes stuff * collide_x but it doesn't work yet * binary_search * it compiles * Entity has bounding box * Update discrete_voxel_shape.rs * Entity::make_bounding_box * ok i'm about to merge az-entity and az-world might be a terrible idea which is why i'm committing first * ok so i moved entity to world * on_pos and move_entity compiles * add send_position * move collision stuff to collision module in az-physics * dimension is no longer an Option * start trying to do collision for the client * collision works :tada: * start adding palette resizing * get_and_set (pain) * it compiles but probably won't work * add a test * remove printlns * add more tests for palette stuff * ClientboundMoveVec3Packet -> ClientboundMoveEntityPosPacket i think i changed this on accident once * palette resizing works todo: remove the printlns * Remove printlns in palette.rs * fix issues from merge * fixes + work a bit more on physics * Better entities (#19) * well it compiles * add tests to entity storage * add suggestions in azalea-brigadier * this probably causes ub * fix brigadiersuggestions * get rid of entityid * test From<EntityMut> for EntityRef * don't mention other libraries since there's too many * fix warnings * do todos in brigadier suggestions * work on physics * more physics stuff * remove trait feature on az-block i think rust gets confused and compiles the macro without the feature * bump ahash * aes tests in az-crypto * optimize aes's deps * fix crashes * fix section_index for negative numbers and test * fix BlockPos protocol implementation * remove some debug prints * prepare to add ai_step * make ai step work * clippy
Diffstat (limited to 'azalea-core/src/direction.rs')
-rw-r--r--azalea-core/src/direction.rs72
1 files changed, 72 insertions, 0 deletions
diff --git a/azalea-core/src/direction.rs b/azalea-core/src/direction.rs
index d3083922..96d20a10 100644
--- a/azalea-core/src/direction.rs
+++ b/azalea-core/src/direction.rs
@@ -1,5 +1,7 @@
use azalea_buf::McBuf;
+use crate::floor_mod;
+
#[derive(Clone, Copy, Debug, McBuf)]
pub enum Direction {
Down = 0,
@@ -9,3 +11,73 @@ pub enum Direction {
West = 4,
East = 5,
}
+
+#[derive(Clone, Copy, Debug)]
+pub enum Axis {
+ X = 0,
+ Y = 1,
+ Z = 2,
+}
+
+#[derive(Clone, Copy, Debug)]
+pub enum AxisCycle {
+ None = 0,
+ Forward = 1,
+ Backward = 2,
+}
+
+impl Axis {
+ /// Pick x, y, or z from the arguments depending on the axis.
+ #[inline]
+ pub fn choose<T>(&self, x: T, y: T, z: T) -> T {
+ match self {
+ Axis::X => x,
+ Axis::Y => y,
+ Axis::Z => z,
+ }
+ }
+
+ pub fn from_ordinal(ordinal: u32) -> Self {
+ match ordinal {
+ 0 => Axis::X,
+ 1 => Axis::Y,
+ 2 => Axis::Z,
+ _ => panic!("Invalid ordinal {}", ordinal),
+ }
+ }
+}
+
+impl AxisCycle {
+ pub fn from_ordinal(ordinal: u32) -> Self {
+ match ordinal {
+ 0 => Self::None,
+ 1 => Self::Forward,
+ 2 => Self::Backward,
+ _ => panic!("invalid ordinal"),
+ }
+ }
+ pub fn between(axis0: Axis, axis1: Axis) -> Self {
+ Self::from_ordinal(floor_mod(axis1 as i32 - axis0 as i32, 3))
+ }
+ pub fn inverse(self) -> Self {
+ match self {
+ Self::None => Self::None,
+ Self::Forward => Self::Backward,
+ Self::Backward => Self::Forward,
+ }
+ }
+ pub fn cycle(self, axis: Axis) -> Axis {
+ match self {
+ Self::None => axis,
+ Self::Forward => Axis::from_ordinal(floor_mod(axis as i32 + 1, 3)),
+ Self::Backward => Axis::from_ordinal(floor_mod(axis as i32 - 1, 3)),
+ }
+ }
+ pub fn cycle_xyz(self, x: u32, y: u32, z: u32, axis: Axis) -> u32 {
+ match self {
+ Self::None => axis.choose(x, y, z),
+ Self::Forward => axis.choose(z, x, y),
+ Self::Backward => axis.choose(y, z, x),
+ }
+ }
+}