mirror of
https://github.com/Minestom/Minestom.git
synced 2025-04-09 21:55:42 +02:00
Improve collision performance (#2321)
* Improve fastPhysics perfomance * Re-add final to Vec
This commit is contained in:
parent
7b180172ce
commit
f917ba1b9f
@ -222,50 +222,45 @@ final class BlockCollision {
|
|||||||
@NotNull SweepResult finalResult) {
|
@NotNull SweepResult finalResult) {
|
||||||
for (Vec point : allFaces) {
|
for (Vec point : allFaces) {
|
||||||
final Vec pointBefore = point.add(entityPosition);
|
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.
|
// 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.
|
// This means we must check every combination of block movements when an entity moves over an axis.
|
||||||
// 000, 001, 010, 011, etc.
|
// 000, 001, 010, 011, etc.
|
||||||
// There are 8 of these combinations
|
// There are 8 of these combinations
|
||||||
// Checks can be limited by checking if we moved across an axis line
|
// Checks can be limited by checking if we moved across an axis line
|
||||||
|
|
||||||
boolean needsX = pointBefore.x() != pointAfter.x();
|
int beforeX = pointBefore.blockX();
|
||||||
boolean needsY = pointBefore.y() != pointAfter.y();
|
int beforeY = pointBefore.blockY();
|
||||||
boolean needsZ = pointBefore.z() != pointAfter.z();
|
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(beforeX, beforeY, beforeZ, velocity, entityPosition, boundingBox, getter, finalResult);
|
||||||
checkBoundingBox(pointAfter.blockX(), pointAfter.blockY(), pointAfter.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
|
|
||||||
|
|
||||||
checkBoundingBox(pointAfter.blockX(), pointAfter.blockY(), pointBefore.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
|
if (needsX | needsY | needsZ) {
|
||||||
checkBoundingBox(pointAfter.blockX(), pointBefore.blockY(), pointAfter.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
|
if (needsX)
|
||||||
checkBoundingBox(pointBefore.blockX(), pointAfter.blockY(), pointAfter.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
|
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);
|
if ((needsX & needsY) | (needsX & needsZ) | (needsY & needsZ)) {
|
||||||
checkBoundingBox(pointBefore.blockX(), pointAfter.blockY(), pointBefore.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
|
if (needsX & needsY)
|
||||||
checkBoundingBox(pointBefore.blockX(), pointBefore.blockY(), pointAfter.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
|
checkBoundingBox(afterX, afterY, beforeZ, velocity, entityPosition, boundingBox, getter, finalResult);
|
||||||
} else if (needsX && needsY) {
|
if (needsX & needsZ)
|
||||||
checkBoundingBox(pointAfter.blockX(), pointAfter.blockY(), pointBefore.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
|
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);
|
if (needsX & needsY & needsZ)
|
||||||
checkBoundingBox(pointBefore.blockX(), pointAfter.blockY(), pointBefore.blockZ(), velocity, entityPosition, boundingBox, getter, finalResult);
|
checkBoundingBox(afterX, afterY, afterZ, 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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user