From cd8a37d2dadbea94800998c3eee43f279ebe2f77 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 27 Jan 2025 22:54:10 +0000 Subject: [PATCH] Skip overlapping AABB checks if the block is a cube --- src/world/World.php | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/world/World.php b/src/world/World.php index 7bfed3c272..12cabfe0f0 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -1575,26 +1575,30 @@ private function getBlockCollisionBoxesForCell(int $x, int $y, int $z, array $co ?->getBlockStateId($x & Chunk::COORD_MASK, $y, $z & Chunk::COORD_MASK) ?? Block::EMPTY_STATE_ID; $cellBB = null; - $boxes = match($collisionInfo[$stateId]){ + $stateCollisionInfo = $collisionInfo[$stateId] ?? throw new AssumptionFailedError("This should always exist"); + $boxes = match($stateCollisionInfo){ RuntimeBlockStateRegistry::COLLISION_NONE => [], RuntimeBlockStateRegistry::COLLISION_CUBE => [$cellBB = AxisAlignedBB::one()->offset($x, $y, $z)], default => $this->getBlockAt($x, $y, $z)->getCollisionBoxes() }; - foreach(Facing::OFFSET as [$dx, $dy, $dz]){ - $offsetY = $y + $dy; - if($offsetY < $this->minY || $offsetY > $this->maxY){ - continue; - } - $stateId = $this - ->getChunk(($x + $dx) >> Chunk::COORD_BIT_SIZE, ($z + $dz) >> Chunk::COORD_BIT_SIZE) - ?->getBlockStateId(($x + $dx) & Chunk::COORD_MASK, $offsetY, ($z + $dz) & Chunk::COORD_MASK) ?? Block::EMPTY_STATE_ID; - if($collisionInfo[$stateId] === RuntimeBlockStateRegistry::COLLISION_MAY_OVERFLOW){ - $cellBB ??= AxisAlignedBB::one()->offset($x, $y, $z); - $extraBoxes = $this->getBlockAt($x + $dx, $offsetY, $z + $dz)->getCollisionBoxes(); - foreach($extraBoxes as $extraBox){ - if($extraBox->intersectsWith($cellBB)){ - $boxes[] = $extraBox; + //overlapping AABBs can't make any difference if this is a cube, so we can save some CPU cycles in this common case + if($stateCollisionInfo !== RuntimeBlockStateRegistry::COLLISION_CUBE){ + foreach(Facing::OFFSET as [$dx, $dy, $dz]){ + $offsetY = $y + $dy; + if($offsetY < $this->minY || $offsetY > $this->maxY){ + continue; + } + $stateId = $this + ->getChunk(($x + $dx) >> Chunk::COORD_BIT_SIZE, ($z + $dz) >> Chunk::COORD_BIT_SIZE) + ?->getBlockStateId(($x + $dx) & Chunk::COORD_MASK, $offsetY, ($z + $dz) & Chunk::COORD_MASK) ?? Block::EMPTY_STATE_ID; + if($collisionInfo[$stateId] === RuntimeBlockStateRegistry::COLLISION_MAY_OVERFLOW){ + $cellBB ??= AxisAlignedBB::one()->offset($x, $y, $z); + $extraBoxes = $this->getBlockAt($x + $dx, $offsetY, $z + $dz)->getCollisionBoxes(); + foreach($extraBoxes as $extraBox){ + if($extraBox->intersectsWith($cellBB)){ + $boxes[] = $extraBox; + } } } }