108 lines
2.6 KiB
JavaScript
108 lines
2.6 KiB
JavaScript
|
class AABB {
|
||
|
constructor (x0, y0, z0, x1, y1, z1) {
|
||
|
this.minX = x0
|
||
|
this.minY = y0
|
||
|
this.minZ = z0
|
||
|
this.maxX = x1
|
||
|
this.maxY = y1
|
||
|
this.maxZ = z1
|
||
|
}
|
||
|
|
||
|
clone () {
|
||
|
return new AABB(this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ)
|
||
|
}
|
||
|
|
||
|
floor () {
|
||
|
this.minX = Math.floor(this.minX)
|
||
|
this.minY = Math.floor(this.minY)
|
||
|
this.minZ = Math.floor(this.minZ)
|
||
|
this.maxX = Math.floor(this.maxX)
|
||
|
this.maxY = Math.floor(this.maxY)
|
||
|
this.maxZ = Math.floor(this.maxZ)
|
||
|
}
|
||
|
|
||
|
extend (dx, dy, dz) {
|
||
|
if (dx < 0) this.minX += dx
|
||
|
else this.maxX += dx
|
||
|
|
||
|
if (dy < 0) this.minY += dy
|
||
|
else this.maxY += dy
|
||
|
|
||
|
if (dz < 0) this.minZ += dz
|
||
|
else this.maxZ += dz
|
||
|
|
||
|
return this
|
||
|
}
|
||
|
|
||
|
contract (x, y, z) {
|
||
|
this.minX += x
|
||
|
this.minY += y
|
||
|
this.minZ += z
|
||
|
this.maxX -= x
|
||
|
this.maxY -= y
|
||
|
this.maxZ -= z
|
||
|
return this
|
||
|
}
|
||
|
|
||
|
expand (x, y, z) {
|
||
|
this.minX -= x
|
||
|
this.minY -= y
|
||
|
this.minZ -= z
|
||
|
this.maxX += x
|
||
|
this.maxY += y
|
||
|
this.maxZ += z
|
||
|
return this
|
||
|
}
|
||
|
|
||
|
offset (x, y, z) {
|
||
|
this.minX += x
|
||
|
this.minY += y
|
||
|
this.minZ += z
|
||
|
this.maxX += x
|
||
|
this.maxY += y
|
||
|
this.maxZ += z
|
||
|
return this
|
||
|
}
|
||
|
|
||
|
computeOffsetX (other, offsetX) {
|
||
|
if (other.maxY > this.minY && other.minY < this.maxY && other.maxZ > this.minZ && other.minZ < this.maxZ) {
|
||
|
if (offsetX > 0.0 && other.maxX <= this.minX) {
|
||
|
offsetX = Math.min(this.minX - other.maxX, offsetX)
|
||
|
} else if (offsetX < 0.0 && other.minX >= this.maxX) {
|
||
|
offsetX = Math.max(this.maxX - other.minX, offsetX)
|
||
|
}
|
||
|
}
|
||
|
return offsetX
|
||
|
}
|
||
|
|
||
|
computeOffsetY (other, offsetY) {
|
||
|
if (other.maxX > this.minX && other.minX < this.maxX && other.maxZ > this.minZ && other.minZ < this.maxZ) {
|
||
|
if (offsetY > 0.0 && other.maxY <= this.minY) {
|
||
|
offsetY = Math.min(this.minY - other.maxY, offsetY)
|
||
|
} else if (offsetY < 0.0 && other.minY >= this.maxY) {
|
||
|
offsetY = Math.max(this.maxY - other.minY, offsetY)
|
||
|
}
|
||
|
}
|
||
|
return offsetY
|
||
|
}
|
||
|
|
||
|
computeOffsetZ (other, offsetZ) {
|
||
|
if (other.maxX > this.minX && other.minX < this.maxX && other.maxY > this.minY && other.minY < this.maxY) {
|
||
|
if (offsetZ > 0.0 && other.maxZ <= this.minZ) {
|
||
|
offsetZ = Math.min(this.minZ - other.maxZ, offsetZ)
|
||
|
} else if (offsetZ < 0.0 && other.minZ >= this.maxZ) {
|
||
|
offsetZ = Math.max(this.maxZ - other.minZ, offsetZ)
|
||
|
}
|
||
|
}
|
||
|
return offsetZ
|
||
|
}
|
||
|
|
||
|
intersects (other) {
|
||
|
return this.minX < other.maxX && this.maxX > other.minX &&
|
||
|
this.minY < other.maxY && this.maxY > other.minY &&
|
||
|
this.minZ < other.maxZ && this.maxZ > other.minZ
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = AABB
|