Skip to content

Commit

Permalink
Facing and Axis to enum (#91)
Browse files Browse the repository at this point in the history
  • Loading branch information
Dhaiven authored Dec 3, 2024
1 parent 22f0a61 commit 40d3fdd
Show file tree
Hide file tree
Showing 6 changed files with 123 additions and 188 deletions.
24 changes: 4 additions & 20 deletions src/Axis.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,24 +23,8 @@

namespace pocketmine\math;

final class Axis{
private function __construct(){
//NOOP
}

public const Y = 0;
public const Z = 1;
public const X = 2;

/**
* Returns a human-readable string representation of the given axis.
*/
public static function toString(int $axis) : string{
return match($axis){
Axis::Y => "y",
Axis::Z => "z",
Axis::X => "x",
default => throw new \InvalidArgumentException("Invalid axis $axis")
};
}
enum Axis{
case Y;
case Z;
case X;
}
64 changes: 23 additions & 41 deletions src/AxisAlignedBB.php
Original file line number Diff line number Diff line change
Expand Up @@ -136,20 +136,18 @@ public function offsetCopy(float $x, float $y, float $z) : AxisAlignedBB{
/**
* Offsets this AxisAlignedBB in the given direction by the specified distance.
*
* @param int $face one of the Facing::* constants
*
* @return $this
*/
public function offsetTowards(int $face, float $distance) : AxisAlignedBB{
[$offsetX, $offsetY, $offsetZ] = Facing::OFFSET[$face] ?? throw new \InvalidArgumentException("Invalid Facing $face");
public function offsetTowards(Facing $face, float $distance) : AxisAlignedBB{
[$offsetX, $offsetY, $offsetZ] = $face->offset();

return $this->offset($offsetX * $distance, $offsetY * $distance, $offsetZ * $distance);
}

/**
* Returns an offset clone of this AxisAlignedBB.
*/
public function offsetTowardsCopy(int $face, float $distance) : AxisAlignedBB{
public function offsetTowardsCopy(Facing $face, float $distance) : AxisAlignedBB{
return (clone $this)->offsetTowards($face, $distance);
}

Expand Down Expand Up @@ -182,17 +180,15 @@ public function contractedCopy(float $x, float $y, float $z) : AxisAlignedBB{
* @param float $distance Negative values pull the face in, positive values push out.
*
* @return $this
* @throws \InvalidArgumentException
*/
public function extend(int $face, float $distance) : AxisAlignedBB{
public function extend(Facing $face, float $distance) : AxisAlignedBB{
match($face){
Facing::DOWN => $this->minY -= $distance,
Facing::UP => $this->maxY += $distance,
Facing::NORTH => $this->minZ -= $distance,
Facing::SOUTH => $this->maxZ += $distance,
Facing::WEST => $this->minX -= $distance,
Facing::EAST => $this->maxX += $distance,
default => throw new \InvalidArgumentException("Invalid face $face"),
};

return $this;
Expand All @@ -201,10 +197,8 @@ public function extend(int $face, float $distance) : AxisAlignedBB{
/**
* Returns an extended clone of this bounding box.
* @see AxisAlignedBB::extend()
*
* @throws \InvalidArgumentException
*/
public function extendedCopy(int $face, float $distance) : AxisAlignedBB{
public function extendedCopy(Facing $face, float $distance) : AxisAlignedBB{
return (clone $this)->extend($face, $distance);
}

Expand All @@ -215,32 +209,27 @@ public function extendedCopy(int $face, float $distance) : AxisAlignedBB{
* @param float $distance Positive values pull the face in, negative values push out.
*
* @return $this
* @throws \InvalidArgumentException
*/
public function trim(int $face, float $distance) : AxisAlignedBB{
public function trim(Facing $face, float $distance) : AxisAlignedBB{
return $this->extend($face, -$distance);
}

/**
* Returns a trimmed clone of this bounding box.
* @see AxisAlignedBB::trim()
*
* @throws \InvalidArgumentException
*/
public function trimmedCopy(int $face, float $distance) : AxisAlignedBB{
public function trimmedCopy(Facing $face, float $distance) : AxisAlignedBB{
return $this->extendedCopy($face, -$distance);
}

/**
* Increases the dimension of the AABB along the given axis.
*
* @param int $axis one of the Axis::* constants
* @param float $distance Negative values reduce width, positive values increase width.
*
* @return $this
* @throws \InvalidArgumentException
*/
public function stretch(int $axis, float $distance) : AxisAlignedBB{
public function stretch(Axis $axis, float $distance) : AxisAlignedBB{
if($axis === Axis::Y){
$this->minY -= $distance;
$this->maxY += $distance;
Expand All @@ -250,19 +239,16 @@ public function stretch(int $axis, float $distance) : AxisAlignedBB{
}elseif($axis === Axis::X){
$this->minX -= $distance;
$this->maxX += $distance;
}else{
throw new \InvalidArgumentException("Invalid axis $axis");
}

return $this;
}

/**
* Returns a stretched copy of this bounding box.
* @see AxisAlignedBB::stretch()
*
* @throws \InvalidArgumentException
*/
public function stretchedCopy(int $axis, float $distance) : AxisAlignedBB{
public function stretchedCopy(Axis $axis, float $distance) : AxisAlignedBB{
return (clone $this)->stretch($axis, $distance);
}

Expand All @@ -271,19 +257,16 @@ public function stretchedCopy(int $axis, float $distance) : AxisAlignedBB{
* @see AxisAlignedBB::stretch()
*
* @return $this
* @throws \InvalidArgumentException
*/
public function squash(int $axis, float $distance) : AxisAlignedBB{
public function squash(Axis $axis, float $distance) : AxisAlignedBB{
return $this->stretch($axis, -$distance);
}

/**
* Returns a squashed copy of this bounding box.
* @see AxisAlignedBB::squash()
*
* @throws \InvalidArgumentException
*/
public function squashedCopy(int $axis, float $distance) : AxisAlignedBB{
public function squashedCopy(Axis $axis, float $distance) : AxisAlignedBB{
return $this->stretchedCopy($axis, -$distance);
}

Expand Down Expand Up @@ -463,29 +446,28 @@ public function calculateIntercept(Vector3 $pos1, Vector3 $pos2) : ?RayTraceResu
$v6 = null;
}

$vector = null;
$distance = PHP_INT_MAX;
$face = -1;
$hitInfo = null;

foreach([
Facing::WEST => $v1,
Facing::EAST => $v2,
Facing::DOWN => $v3,
Facing::UP => $v4,
Facing::NORTH => $v5,
Facing::SOUTH => $v6
] as $f => $v){
[Facing::WEST, $v1],
[Facing::EAST, $v2],
[Facing::DOWN, $v3],
[Facing::UP, $v4],
[Facing::NORTH, $v5],
[Facing::SOUTH, $v6]
] as [$facing, $v]){
if($v !== null and ($d = $pos1->distanceSquared($v)) < $distance){
$vector = $v;
$distance = $d;
$face = $f;
$hitInfo = [$facing, $v];
}
}

if($vector === null){
if($hitInfo === null){
return null;
}

[$face, $vector] = $hitInfo;
return new RayTraceResult($this, $face, $vector);
}

Expand Down
Loading

0 comments on commit 40d3fdd

Please sign in to comment.