aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/AABB.cpp
diff options
context:
space:
mode:
authorLoki Rautio <lokirautio@gmail.com>2026-03-04 03:56:03 -0600
committerLoki Rautio <lokirautio@gmail.com>2026-03-04 03:56:03 -0600
commit42aec6dac53dffa6afe072560a7e1d4986112538 (patch)
tree0836426857391df1b6a83f6368a183f83ec9b104 /Minecraft.World/AABB.cpp
parentc9d58eeac7c72f0b3038e084667b4d89a6249fce (diff)
parentef9b6fd500dfabd9463267b0dd9e29577eea8a2b (diff)
Merge branch 'main' into pr/win64-world-saves
# Conflicts: # Minecraft.Client/MinecraftServer.cpp # README.md
Diffstat (limited to 'Minecraft.World/AABB.cpp')
-rw-r--r--Minecraft.World/AABB.cpp310
1 files changed, 161 insertions, 149 deletions
diff --git a/Minecraft.World/AABB.cpp b/Minecraft.World/AABB.cpp
index 4c867f0d..8bc8e140 100644
--- a/Minecraft.World/AABB.cpp
+++ b/Minecraft.World/AABB.cpp
@@ -49,7 +49,7 @@ void AABB::ReleaseThreadStorage()
AABB *AABB::newPermanent(double x0, double y0, double z0, double x1, double y1, double z1)
{
- return new AABB(x0, y0, z0, x1, y1, z1);
+ return new AABB(x0, y0, z0, x1, y1, z1);
}
void AABB::clearPool()
@@ -66,277 +66,289 @@ AABB *AABB::newTemp(double x0, double y0, double z0, double x1, double y1, doubl
AABB *thisAABB = &tls->pool[tls->poolPointer];
thisAABB->set(x0, y0, z0, x1, y1, z1);
tls->poolPointer = ( tls->poolPointer + 1 ) % ThreadStorage::POOL_SIZE;
- return thisAABB;
+ return thisAABB;
}
AABB::AABB(double x0, double y0, double z0, double x1, double y1, double z1)
{
- this->x0 = x0;
- this->y0 = y0;
- this->z0 = z0;
- this->x1 = x1;
- this->y1 = y1;
- this->z1 = z1;
+ this->x0 = x0;
+ this->y0 = y0;
+ this->z0 = z0;
+ this->x1 = x1;
+ this->y1 = y1;
+ this->z1 = z1;
}
AABB *AABB::set(double x0, double y0, double z0, double x1, double y1, double z1)
{
- this->x0 = x0;
- this->y0 = y0;
- this->z0 = z0;
- this->x1 = x1;
- this->y1 = y1;
- this->z1 = z1;
- return this;
+ this->x0 = x0;
+ this->y0 = y0;
+ this->z0 = z0;
+ this->x1 = x1;
+ this->y1 = y1;
+ this->z1 = z1;
+ return this;
}
AABB *AABB::expand(double xa, double ya, double za)
{
- double _x0 = x0;
- double _y0 = y0;
- double _z0 = z0;
- double _x1 = x1;
- double _y1 = y1;
- double _z1 = z1;
+ double _x0 = x0;
+ double _y0 = y0;
+ double _z0 = z0;
+ double _x1 = x1;
+ double _y1 = y1;
+ double _z1 = z1;
- if (xa < 0) _x0 += xa;
- if (xa > 0) _x1 += xa;
+ if (xa < 0) _x0 += xa;
+ if (xa > 0) _x1 += xa;
- if (ya < 0) _y0 += ya;
- if (ya > 0) _y1 += ya;
+ if (ya < 0) _y0 += ya;
+ if (ya > 0) _y1 += ya;
- if (za < 0) _z0 += za;
- if (za > 0) _z1 += za;
+ if (za < 0) _z0 += za;
+ if (za > 0) _z1 += za;
- return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1);
+ return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1);
}
AABB *AABB::grow(double xa, double ya, double za)
{
- double _x0 = x0 - xa;
- double _y0 = y0 - ya;
- double _z0 = z0 - za;
- double _x1 = x1 + xa;
- double _y1 = y1 + ya;
- double _z1 = z1 + za;
+ double _x0 = x0 - xa;
+ double _y0 = y0 - ya;
+ double _z0 = z0 - za;
+ double _x1 = x1 + xa;
+ double _y1 = y1 + ya;
+ double _z1 = z1 + za;
- return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1);
+ return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1);
+}
+
+AABB *AABB::minmax(AABB *other)
+{
+ double _x0 = min(x0, other->x0);
+ double _y0 = min(y0, other->y0);
+ double _z0 = min(z0, other->z0);
+ double _x1 = max(x1, other->x1);
+ double _y1 = max(y1, other->y1);
+ double _z1 = max(z1, other->z1);
+
+ return newTemp(_x0, _y0, _z0, _x1, _y1, _z1);
}
AABB *AABB::cloneMove(double xa, double ya, double za)
{
- return AABB::newTemp(x0 + xa, y0 + ya, z0 + za, x1 + xa, y1 + ya, z1 + za);
+ return AABB::newTemp(x0 + xa, y0 + ya, z0 + za, x1 + xa, y1 + ya, z1 + za);
}
double AABB::clipXCollide(AABB *c, double xa)
{
- if (c->y1 <= y0 || c->y0 >= y1) return xa;
- if (c->z1 <= z0 || c->z0 >= z1) return xa;
+ if (c->y1 <= y0 || c->y0 >= y1) return xa;
+ if (c->z1 <= z0 || c->z0 >= z1) return xa;
- if (xa > 0 && c->x1 <= x0)
+ if (xa > 0 && c->x1 <= x0)
{
- double max = x0 - c->x1;
- if (max < xa) xa = max;
- }
- if (xa < 0 && c->x0 >= x1)
+ double max = x0 - c->x1;
+ if (max < xa) xa = max;
+ }
+ if (xa < 0 && c->x0 >= x1)
{
- double max = x1 - c->x0;
- if (max > xa) xa = max;
- }
+ double max = x1 - c->x0;
+ if (max > xa) xa = max;
+ }
- return xa;
+ return xa;
}
double AABB::clipYCollide(AABB *c, double ya)
{
- if (c->x1 <= x0 || c->x0 >= x1) return ya;
- if (c->z1 <= z0 || c->z0 >= z1) return ya;
+ if (c->x1 <= x0 || c->x0 >= x1) return ya;
+ if (c->z1 <= z0 || c->z0 >= z1) return ya;
- if (ya > 0 && c->y1 <= y0)
+ if (ya > 0 && c->y1 <= y0)
{
- double max = y0 - c->y1;
- if (max < ya) ya = max;
- }
- if (ya < 0 && c->y0 >= y1)
+ double max = y0 - c->y1;
+ if (max < ya) ya = max;
+ }
+ if (ya < 0 && c->y0 >= y1)
{
- double max = y1 - c->y0;
- if (max > ya) ya = max;
- }
+ double max = y1 - c->y0;
+ if (max > ya) ya = max;
+ }
- return ya;
+ return ya;
}
double AABB::clipZCollide(AABB *c, double za)
{
- if (c->x1 <= x0 || c->x0 >= x1) return za;
- if (c->y1 <= y0 || c->y0 >= y1) return za;
+ if (c->x1 <= x0 || c->x0 >= x1) return za;
+ if (c->y1 <= y0 || c->y0 >= y1) return za;
- if (za > 0 && c->z1 <= z0)
+ if (za > 0 && c->z1 <= z0)
{
- double max = z0 - c->z1;
- if (max < za) za = max;
- }
- if (za < 0 && c->z0 >= z1)
+ double max = z0 - c->z1;
+ if (max < za) za = max;
+ }
+ if (za < 0 && c->z0 >= z1)
{
- double max = z1 - c->z0;
- if (max > za) za = max;
- }
+ double max = z1 - c->z0;
+ if (max > za) za = max;
+ }
- return za;
+ return za;
}
bool AABB::intersects(AABB *c)
{
- if (c->x1 <= x0 || c->x0 >= x1) return false;
- if (c->y1 <= y0 || c->y0 >= y1) return false;
- if (c->z1 <= z0 || c->z0 >= z1) return false;
- return true;
+ if (c->x1 <= x0 || c->x0 >= x1) return false;
+ if (c->y1 <= y0 || c->y0 >= y1) return false;
+ if (c->z1 <= z0 || c->z0 >= z1) return false;
+ return true;
}
bool AABB::intersectsInner(AABB *c)
{
- if (c->x1 < x0 || c->x0 > x1) return false;
- if (c->y1 < y0 || c->y0 > y1) return false;
- if (c->z1 < z0 || c->z0 > z1) return false;
- return true;
+ if (c->x1 < x0 || c->x0 > x1) return false;
+ if (c->y1 < y0 || c->y0 > y1) return false;
+ if (c->z1 < z0 || c->z0 > z1) return false;
+ return true;
}
AABB *AABB::move(double xa, double ya, double za)
{
- x0 += xa;
- y0 += ya;
- z0 += za;
- x1 += xa;
- y1 += ya;
- z1 += za;
- return this;
+ x0 += xa;
+ y0 += ya;
+ z0 += za;
+ x1 += xa;
+ y1 += ya;
+ z1 += za;
+ return this;
}
bool AABB::intersects(double x02, double y02, double z02, double x12, double y12, double z12)
{
- if (x12 <= x0 || x02 >= x1) return false;
- if (y12 <= y0 || y02 >= y1) return false;
- if (z12 <= z0 || z02 >= z1) return false;
- return true;
+ if (x12 <= x0 || x02 >= x1) return false;
+ if (y12 <= y0 || y02 >= y1) return false;
+ if (z12 <= z0 || z02 >= z1) return false;
+ return true;
}
bool AABB::contains(Vec3 *p)
{
- if (p->x <= x0 || p->x >= x1) return false;
- if (p->y <= y0 || p->y >= y1) return false;
- if (p->z <= z0 || p->z >= z1) return false;
- return true;
+ if (p->x <= x0 || p->x >= x1) return false;
+ if (p->y <= y0 || p->y >= y1) return false;
+ if (p->z <= z0 || p->z >= z1) return false;
+ return true;
}
// 4J Added
bool AABB::containsIncludingLowerBound(Vec3 *p)
{
- if (p->x < x0 || p->x >= x1) return false;
- if (p->y < y0 || p->y >= y1) return false;
- if (p->z < z0 || p->z >= z1) return false;
- return true;
+ if (p->x < x0 || p->x >= x1) return false;
+ if (p->y < y0 || p->y >= y1) return false;
+ if (p->z < z0 || p->z >= z1) return false;
+ return true;
}
double AABB::getSize()
{
- double xs = x1 - x0;
- double ys = y1 - y0;
- double zs = z1 - z0;
- return (xs + ys + zs) / 3.0f;
+ double xs = x1 - x0;
+ double ys = y1 - y0;
+ double zs = z1 - z0;
+ return (xs + ys + zs) / 3.0f;
}
AABB *AABB::shrink(double xa, double ya, double za)
{
- double _x0 = x0 + xa;
- double _y0 = y0 + ya;
- double _z0 = z0 + za;
- double _x1 = x1 - xa;
- double _y1 = y1 - ya;
- double _z1 = z1 - za;
+ double _x0 = x0 + xa;
+ double _y0 = y0 + ya;
+ double _z0 = z0 + za;
+ double _x1 = x1 - xa;
+ double _y1 = y1 - ya;
+ double _z1 = z1 - za;
- return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1);
+ return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1);
}
AABB *AABB::copy()
{
- return AABB::newTemp(x0, y0, z0, x1, y1, z1);
+ return AABB::newTemp(x0, y0, z0, x1, y1, z1);
}
HitResult *AABB::clip(Vec3 *a, Vec3 *b)
{
- Vec3 *xh0 = a->clipX(b, x0);
- Vec3 *xh1 = a->clipX(b, x1);
+ Vec3 *xh0 = a->clipX(b, x0);
+ Vec3 *xh1 = a->clipX(b, x1);
- Vec3 *yh0 = a->clipY(b, y0);
- Vec3 *yh1 = a->clipY(b, y1);
+ Vec3 *yh0 = a->clipY(b, y0);
+ Vec3 *yh1 = a->clipY(b, y1);
- Vec3 *zh0 = a->clipZ(b, z0);
- Vec3 *zh1 = a->clipZ(b, z1);
+ Vec3 *zh0 = a->clipZ(b, z0);
+ Vec3 *zh1 = a->clipZ(b, z1);
- if (!containsX(xh0)) xh0 = NULL;
- if (!containsX(xh1)) xh1 = NULL;
- if (!containsY(yh0)) yh0 = NULL;
- if (!containsY(yh1)) yh1 = NULL;
- if (!containsZ(zh0)) zh0 = NULL;
- if (!containsZ(zh1)) zh1 = NULL;
+ if (!containsX(xh0)) xh0 = NULL;
+ if (!containsX(xh1)) xh1 = NULL;
+ if (!containsY(yh0)) yh0 = NULL;
+ if (!containsY(yh1)) yh1 = NULL;
+ if (!containsZ(zh0)) zh0 = NULL;
+ if (!containsZ(zh1)) zh1 = NULL;
- Vec3 *closest = NULL;
+ Vec3 *closest = NULL;
- if (xh0 != NULL && (closest == NULL || a->distanceToSqr(xh0) < a->distanceToSqr(closest))) closest = xh0;
- if (xh1 != NULL && (closest == NULL || a->distanceToSqr(xh1) < a->distanceToSqr(closest))) closest = xh1;
- if (yh0 != NULL && (closest == NULL || a->distanceToSqr(yh0) < a->distanceToSqr(closest))) closest = yh0;
- if (yh1 != NULL && (closest == NULL || a->distanceToSqr(yh1) < a->distanceToSqr(closest))) closest = yh1;
- if (zh0 != NULL && (closest == NULL || a->distanceToSqr(zh0) < a->distanceToSqr(closest))) closest = zh0;
- if (zh1 != NULL && (closest == NULL || a->distanceToSqr(zh1) < a->distanceToSqr(closest))) closest = zh1;
+ if (xh0 != NULL && (closest == NULL || a->distanceToSqr(xh0) < a->distanceToSqr(closest))) closest = xh0;
+ if (xh1 != NULL && (closest == NULL || a->distanceToSqr(xh1) < a->distanceToSqr(closest))) closest = xh1;
+ if (yh0 != NULL && (closest == NULL || a->distanceToSqr(yh0) < a->distanceToSqr(closest))) closest = yh0;
+ if (yh1 != NULL && (closest == NULL || a->distanceToSqr(yh1) < a->distanceToSqr(closest))) closest = yh1;
+ if (zh0 != NULL && (closest == NULL || a->distanceToSqr(zh0) < a->distanceToSqr(closest))) closest = zh0;
+ if (zh1 != NULL && (closest == NULL || a->distanceToSqr(zh1) < a->distanceToSqr(closest))) closest = zh1;
- if (closest == NULL) return NULL;
+ if (closest == NULL) return NULL;
- int face = -1;
+ int face = -1;
- if (closest == xh0) face = 4;
- if (closest == xh1) face = 5;
- if (closest == yh0) face = 0;
- if (closest == yh1) face = 1;
- if (closest == zh0) face = 2;
- if (closest == zh1) face = 3;
+ if (closest == xh0) face = 4;
+ if (closest == xh1) face = 5;
+ if (closest == yh0) face = 0;
+ if (closest == yh1) face = 1;
+ if (closest == zh0) face = 2;
+ if (closest == zh1) face = 3;
- return new HitResult(0, 0, 0, face, closest);
+ return new HitResult(0, 0, 0, face, closest);
}
bool AABB::containsX(Vec3 *v)
{
- if (v == NULL) return false;
- return v->y >= y0 && v->y <= y1 && v->z >= z0 && v->z <= z1;
+ if (v == NULL) return false;
+ return v->y >= y0 && v->y <= y1 && v->z >= z0 && v->z <= z1;
}
bool AABB::containsY(Vec3 *v)
{
- if (v == NULL) return false;
- return v->x >= x0 && v->x <= x1 && v->z >= z0 && v->z <= z1;
+ if (v == NULL) return false;
+ return v->x >= x0 && v->x <= x1 && v->z >= z0 && v->z <= z1;
}
bool AABB::containsZ(Vec3 *v)
{
- if (v == NULL) return false;
- return v->x >= x0 && v->x <= x1 && v->y >= y0 && v->y <= y1;
+ if (v == NULL) return false;
+ return v->x >= x0 && v->x <= x1 && v->y >= y0 && v->y <= y1;
}
void AABB::set(AABB *b)
{
- this->x0 = b->x0;
- this->y0 = b->y0;
- this->z0 = b->z0;
- this->x1 = b->x1;
- this->y1 = b->y1;
- this->z1 = b->z1;
+ x0 = b->x0;
+ y0 = b->y0;
+ z0 = b->z0;
+ x1 = b->x1;
+ y1 = b->y1;
+ z1 = b->z1;
}
wstring AABB::toString()
{
- return L"box[" + _toString<double>(x0) + L", " + _toString<double>(y0) + L", " + _toString<double>(z0) + L" -> " +
+ return L"box[" + _toString<double>(x0) + L", " + _toString<double>(y0) + L", " + _toString<double>(z0) + L" -> " +
_toString<double>(x1) + L", " + _toString<double>(y1) + L", " + _toString<double>(z1) + L"]";
}