Improve collision performance (#2321)

* Improve fastPhysics perfomance

* Re-add final to Vec
This commit is contained in:
xZeGoe 2024-08-05 12:21:28 +03:00 committed by GitHub
parent 7b180172ce
commit f917ba1b9f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -222,50 +222,45 @@ final class BlockCollision {
@NotNull SweepResult finalResult) {
for (Vec point : allFaces) {
final Vec pointBefore = point.add(entityPosition);
final Vec pointAfter = point.add(entityPosition).add(velocity);
final Vec pointAfter = pointBefore.add(velocity);
// Entity can pass through up to 4 blocks. Starting block, Two intermediate blocks, and a final block.
// This means we must check every combination of block movements when an entity moves over an axis.
// 000, 001, 010, 011, etc.
// There are 8 of these combinations
// Checks can be limited by checking if we moved across an axis line
boolean needsX = pointBefore.x() != pointAfter.x();
boolean needsY = pointBefore.y() != pointAfter.y();
boolean needsZ = pointBefore.z() != pointAfter.z();
int beforeX = pointBefore.blockX();
int beforeY = pointBefore.blockY();
int beforeZ = pointBefore.blockZ();
int afterX = pointAfter.blockX();
int afterY = pointAfter.blockY();
int afterZ = pointAfter.blockZ();
checkBoundingBox(pointBefore.blockX(), pointBefore.blockY(), pointBefore.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
boolean needsX = beforeX != afterX;
boolean needsY = beforeY != afterY;
boolean needsZ = beforeZ != afterZ;
if (needsX && needsY && needsZ) {
checkBoundingBox(pointAfter.blockX(), pointAfter.blockY(), pointAfter.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
checkBoundingBox(beforeX, beforeY, beforeZ, velocity, entityPosition, boundingBox, getter, finalResult);
checkBoundingBox(pointAfter.blockX(), pointAfter.blockY(), pointBefore.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
checkBoundingBox(pointAfter.blockX(), pointBefore.blockY(), pointAfter.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
checkBoundingBox(pointBefore.blockX(), pointAfter.blockY(), pointAfter.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
if (needsX | needsY | needsZ) {
if (needsX)
checkBoundingBox(afterX, beforeY, beforeZ, velocity, entityPosition, boundingBox, getter, finalResult);
if (needsY)
checkBoundingBox(beforeX, afterY, beforeZ, velocity, entityPosition, boundingBox, getter, finalResult);
if (needsZ)
checkBoundingBox(beforeX, beforeY, afterZ, velocity, entityPosition, boundingBox, getter, finalResult);
checkBoundingBox(pointAfter.blockX(), pointBefore.blockY(), pointBefore.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
checkBoundingBox(pointBefore.blockX(), pointAfter.blockY(), pointBefore.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
checkBoundingBox(pointBefore.blockX(), pointBefore.blockY(), pointAfter.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
} else if (needsX && needsY) {
checkBoundingBox(pointAfter.blockX(), pointAfter.blockY(), pointBefore.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
if ((needsX & needsY) | (needsX & needsZ) | (needsY & needsZ)) {
if (needsX & needsY)
checkBoundingBox(afterX, afterY, beforeZ, velocity, entityPosition, boundingBox, getter, finalResult);
if (needsX & needsZ)
checkBoundingBox(afterX, beforeY, afterZ, velocity, entityPosition, boundingBox, getter, finalResult);
if (needsY & needsZ)
checkBoundingBox(beforeX, afterY, afterZ, velocity, entityPosition, boundingBox, getter, finalResult);
checkBoundingBox(pointAfter.blockX(), pointBefore.blockY(), pointBefore.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
checkBoundingBox(pointBefore.blockX(), pointAfter.blockY(), pointBefore.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
} else if (needsX && needsZ) {
checkBoundingBox(pointAfter.blockX(), pointBefore.blockY(), pointAfter.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
checkBoundingBox(pointAfter.blockX(), pointBefore.blockY(), pointBefore.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
checkBoundingBox(pointBefore.blockX(), pointBefore.blockY(), pointAfter.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
} else if (needsY && needsZ) {
checkBoundingBox(pointBefore.blockX(), pointAfter.blockY(), pointAfter.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
checkBoundingBox(pointBefore.blockX(), pointAfter.blockY(), pointBefore.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
checkBoundingBox(pointBefore.blockX(), pointBefore.blockY(), pointAfter.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
} else if (needsX) {
checkBoundingBox(pointAfter.blockX(), pointBefore.blockY(), pointBefore.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
} else if (needsY) {
checkBoundingBox(pointBefore.blockX(), pointAfter.blockY(), pointBefore.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
} else if (needsZ) {
checkBoundingBox(pointBefore.blockX(), pointBefore.blockY(), pointAfter.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
if (needsX & needsY & needsZ)
checkBoundingBox(afterX, afterY, afterZ, velocity, entityPosition, boundingBox, getter, finalResult);
}
}
}
}