Collision1D class
Пакет: com.hypixel.hytale.server.core.modules.collision
Файл: com/hypixel/hytale/server/core/modules/collision/MovingBoxBoxCollisionEvaluator.java
Поля (15)
| Модификаторы | Тип | Имя |
|---|---|---|
|
protected static final int |
COLLISION_INSIDE |
|
protected static final int |
COLLISION_OUTSIDE |
|
protected static final int |
COLLISION_TOUCH_MAX |
|
protected static final int |
COLLISION_TOUCH_MIN |
|
public int |
kind |
|
public double |
max |
|
public double |
min |
|
public double |
normal |
|
public double |
p |
|
public double |
tEnter |
|
public double |
tLeave |
|
public boolean |
touching |
|
public double |
v |
|
double |
var5 |
|
|
var5 |
Методы (10)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
private double |
clampPosprivate double clampPos(double var1) |
|
private void |
computeTouchOrOutsideprivate void computeTouchOrOutside(double var1, double var3, int var5) |
|
|
if if(var5 >= -1.0E-5) |
|
|
if if(this.v < var5 - 1.0E-5) |
|
|
if if(var5 <= 1.0E-5) |
|
|
if if(this.v > var5 + 1.0E-5) |
|
|
if if(this.v < 0.0) |
|
|
if if(this.v != 0.0) |
|
|
if if(this.tEnter != 0.0 && this.tEnter < 1.0E-8) |
|
boolean |
isCollidingboolean isColliding(double var1, double var3) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.modules.collision;
class="kw">import com.hypixel.hytale.math.shape.Box;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector3d;
class="kw">public class MovingBoxBoxCollisionEvaluator class="kw">extends BlockContactData class="kw">implements IBlockCollisionEvaluator {
class="kw">protected boolean touching;
class="kw">protected Box collider;
@Nonnull
class="kw">protected class="kw">final Vector3d pos;
@Nonnull
class="kw">protected class="kw">final Vector3d v;
class="kw">protected boolean checkForOnGround = true;
class="kw">private boolean computeOverlaps;
@Nonnull
class="kw">protected class="kw">final MovingBoxBoxCollisionEvaluator.Collision1D cX;
@Nonnull
class="kw">protected class="kw">final MovingBoxBoxCollisionEvaluator.Collision1D cY;
@Nonnull
class="kw">protected class="kw">final MovingBoxBoxCollisionEvaluator.Collision1D cZ;
class="kw">public MovingBoxBoxCollisionEvaluator() {
this.pos = new Vector3d();
this.v = new Vector3d();
this.cX = new MovingBoxBoxCollisionEvaluator.Collision1D();
this.cY = new MovingBoxBoxCollisionEvaluator.Collision1D();
this.cZ = new MovingBoxBoxCollisionEvaluator.Collision1D();
}
@Override
class="kw">public double getCollisionStart() {
class="kw">return this.collisionStart;
}
@Override
class="kw">public void setCollisionData(@Nonnull BlockCollisionData var1, @Nonnull CollisionConfig var2, int var3) {
var1.setStart(this.collisionPoint, this.collisionStart);
var1.setEnd(this.collisionEnd, this.collisionNormal);
var1.setBlockData(var2);
var1.setDetailBoxIndex(var3);
var1.setTouchingOverlapping(this.touching, this.isOverlapping());
}
class="kw">public boolean isCheckForOnGround() {
class="kw">return this.checkForOnGround;
}
class="kw">public void setCheckForOnGround(boolean var1) {
this.checkForOnGround = var1;
}
class="kw">public boolean isComputeOverlaps() {
class="kw">return this.computeOverlaps;
}
class="kw">public void setComputeOverlaps(boolean var1) {
this.computeOverlaps = var1;
}
@Nonnull
class="kw">public MovingBoxBoxCollisionEvaluator setCollider(Box var1) {
this.collider = var1;
class="kw">return this;
}
@Nonnull
class="kw">public MovingBoxBoxCollisionEvaluator setMove(@Nonnull Vector3d var1, @Nonnull Vector3d var2) {
this.pos.set(var1);
this.v.set(var2);
this.cX.v = var2.x;
this.cY.v = var2.y;
this.cZ.v = var2.z;
class="kw">return this;
}
class="kw">public boolean isBoundingBoxColliding(@Nonnull Box var1, double var2, double var4, double var6) {
this.cX.p = this.pos.x - var2;
this.cY.p = this.pos.y - var4;
this.cZ.p = this.pos.z - var6;
this.onGround = false;
this.touching = false;
this.overlapping = false;
if (!this.cX.isColliding(var1.getMin().x - this.collider.getMax().x, var1.getMax().x - this.collider.getMin().x)) {
class="kw">return false;
}
if (!this.cY.isColliding(var1.getMin().y - this.collider.getMax().y, var1.getMax().y - this.collider.getMin().y)) {
class="kw">return false;
}
if (!this.cZ.isColliding(var1.getMin().z - this.collider.getMax().z, var1.getMax().z - this.collider.getMin().z)) {
class="kw">return false;
}
if (this.cX.kind == 1 && this.cY.kind == 1 && this.cZ.kind == 1) {
this.overlapping = true;
if (!this.computeOverlaps) {
class="kw">return false;
}
this.collisionStart = 0.0;
this.collisionEnd = Double.MAX_VALUE;
this.collisionNormal.set(0.0, 0.0, 0.0);
if (this.cX.tLeave < this.collisionEnd) {
this.collisionEnd = this.cX.tLeave;
this.collisionNormal.set(this.cX.normal, 0.0, 0.0);
}
if (this.cY.tLeave < this.collisionEnd) {
this.collisionEnd = this.cY.tLeave;
this.collisionNormal.set(0.0, this.cY.normal, 0.0);
}
if (this.cZ.tLeave < this.collisionEnd) {
this.collisionEnd = this.cZ.tLeave;
this.collisionNormal.set(0.0, 0.0, this.cZ.normal);
}
class="kw">return true;
} else {
this.collisionStart = -Double.MAX_VALUE;
this.collisionEnd = Double.MAX_VALUE;
if (this.cX.kind == 0) {
this.collisionNormal.set(this.cX.normal, 0.0, 0.0);
this.collisionStart = this.cX.tEnter;
}
if (this.cY.kind == 0 && this.cY.tEnter > this.collisionStart) {
this.collisionNormal.set(0.0, this.cY.normal, 0.0);
this.collisionStart = this.cY.tEnter;
}
if (this.cZ.kind == 0 && this.cZ.tEnter > this.collisionStart) {
this.collisionNormal.set(0.0, 0.0, this.cZ.normal);
this.collisionStart = this.cZ.tEnter;
}
if (!(this.collisionStart > -Double.MAX_VALUE)) {
if (this.checkForOnGround && this.cY.kind == 3) {
this.collisionStart = MathUtil.maxValue(this.cX.tEnter, this.cY.tEnter, this.cZ.tEnter);
this.collisionEnd = MathUtil.minValue(this.cX.tLeave, this.cY.tLeave, this.cZ.tLeave);
this.collisionPoint.set(this.pos);
this.collisionPoint.fma(this.collisionStart, this.v);
this.collisionNormal.set(0.0, this.cY.normal, 0.0);
this.onGround = true;
this.touching = true;
}
class="kw">return false;
} else {
this.collisionEnd = MathUtil.minValue(this.cX.tLeave, this.cY.tLeave, this.cZ.tLeave);
if (this.collisionStart > this.collisionEnd) {
class="kw">return false;
} else {
this.collisionPoint.set(this.pos);
this.collisionPoint.fma(this.collisionStart, this.v);
if (this.checkForOnGround && this.cY.kind == 3) {
this.collisionNormal.set(0.0, this.cY.normal, 0.0);
this.onGround = true;
this.touching = true;
class="kw">return false;
} else {
this.touching = this.cX.kind >= 2 || this.cY.kind >= 2 || this.cZ.kind >= 2;
class="kw">return !this.touching;
}
}
}
}
}
class="kw">public boolean isTouching() {
class="kw">return this.touching;
}
class="kw">public void setCollisionEnd(double var1) {
this.collisionEnd = var1;
}
class="kw">private class="kw">static class Collision1D {
class="kw">protected class="kw">static class="kw">final int COLLISION_OUTSIDE = 0;
class="kw">protected class="kw">static class="kw">final int COLLISION_INSIDE = 1;
class="kw">protected class="kw">static class="kw">final int COLLISION_TOUCH_MIN = 2;
class="kw">protected class="kw">static class="kw">final int COLLISION_TOUCH_MAX = 3;
class="kw">public double p;
class="kw">public double v;
class="kw">public double min;
class="kw">public double max;
class="kw">public double tEnter;
class="kw">public double tLeave;
class="kw">public double normal;
class="kw">public int kind;
class="kw">public boolean touching;
class="kw">private Collision1D() {
}
boolean isColliding(double var1, double var3) {
this.min = var1;
this.max = var3;
this.tEnter = -Double.MAX_VALUE;
this.tLeave = Double.MAX_VALUE;
this.normal = 0.0;
this.touching = false;
double var5 = var1 - this.p;
if (var5 >= -1.0E-5) {
if (this.v < var5 - 1.0E-5) {
class="kw">return false;
}
this.normal = -1.0;
this.computeTouchOrOutside(var3, var5, 2);
class="kw">return true;
} else {
var5 = var3 - this.p;
if (var5 <= 1.0E-5) {
if (this.v > var5 + 1.0E-5) {
class="kw">return false;
}
this.normal = 1.0;
this.computeTouchOrOutside(var1, var5, 3);
class="kw">return true;
} else {
this.tEnter = 0.0;
if (this.v < 0.0) {
this.tLeave = this.clampPos((var1 - this.p) / this.v);
this.normal = 1.0;
} else if (this.v > 0.0) {
this.tLeave = this.clampPos((var3 - this.p) / this.v);
this.normal = -1.0;
}
this.kind = 1;
class="kw">return true;
}
}
}
class="kw">private void computeTouchOrOutside(double var1, double var3, int var5) {
if (this.v != 0.0) {
this.tEnter = MathUtil.clamp(var3 / this.v, 0.0, 1.0);
if (this.tEnter != 0.0 && this.tEnter < 1.0E-8) {
this.tEnter = 0.0;
}
this.tLeave = this.clampPos((var1 - this.p) / this.v);
this.kind = 0;
} else {
this.tEnter = 0.0;
this.kind = var5;
}
}
class="kw">private double clampPos(double var1) {
class="kw">return var1 >= 0.0 ? var1 : 0.0;
}
}
}