106 lines
2.5 KiB
Java
106 lines
2.5 KiB
Java
package com.hypixel.hytale.math.vector;
|
|
|
|
import javax.annotation.Nonnull;
|
|
|
|
public class Vector4d {
|
|
public static final int COMPONENT_X = 0;
|
|
public static final int COMPONENT_Y = 1;
|
|
public static final int COMPONENT_Z = 2;
|
|
public static final int COMPONENT_W = 3;
|
|
public double x;
|
|
public double y;
|
|
public double z;
|
|
public double w;
|
|
|
|
public Vector4d() {
|
|
this(0.0, 0.0, 0.0, 0.0);
|
|
}
|
|
|
|
public Vector4d(double x, double y, double z, double w) {
|
|
this.x = x;
|
|
this.y = y;
|
|
this.z = z;
|
|
this.w = w;
|
|
}
|
|
|
|
@Nonnull
|
|
public static Vector4d newPosition(double x, double y, double z) {
|
|
return new Vector4d(x, y, z, 1.0);
|
|
}
|
|
|
|
@Nonnull
|
|
public static Vector4d newPosition(@Nonnull Vector3d v) {
|
|
return new Vector4d(v.x, v.y, v.z, 1.0);
|
|
}
|
|
|
|
@Nonnull
|
|
public static Vector4d newDirection(double x, double y, double z) {
|
|
return new Vector4d(x, y, z, 0.0);
|
|
}
|
|
|
|
@Nonnull
|
|
public Vector4d setDirection() {
|
|
this.w = 0.0;
|
|
return this;
|
|
}
|
|
|
|
@Nonnull
|
|
public Vector4d setPosition() {
|
|
this.w = 1.0;
|
|
return this;
|
|
}
|
|
|
|
@Nonnull
|
|
public Vector4d assign(@Nonnull Vector4d v) {
|
|
return this.assign(v.x, v.y, v.z, v.w);
|
|
}
|
|
|
|
@Nonnull
|
|
public Vector4d assign(double x, double y, double z, double w) {
|
|
this.x = x;
|
|
this.y = y;
|
|
this.z = z;
|
|
this.w = w;
|
|
return this;
|
|
}
|
|
|
|
@Nonnull
|
|
public Vector4d lerp(@Nonnull Vector4d dest, double lerpFactor, @Nonnull Vector4d target) {
|
|
target.assign(
|
|
(dest.x - this.x) * lerpFactor + this.x,
|
|
(dest.y - this.y) * lerpFactor + this.y,
|
|
(dest.z - this.z) * lerpFactor + this.z,
|
|
(dest.w - this.w) * lerpFactor + this.w
|
|
);
|
|
return target;
|
|
}
|
|
|
|
public void perspectiveTransform() {
|
|
double invW = 1.0 / this.w;
|
|
this.x *= invW;
|
|
this.y *= invW;
|
|
this.z *= invW;
|
|
this.w = 1.0;
|
|
}
|
|
|
|
public boolean isInsideFrustum() {
|
|
return Math.abs(this.x) <= Math.abs(this.w) && Math.abs(this.y) <= Math.abs(this.w) && Math.abs(this.z) <= Math.abs(this.w);
|
|
}
|
|
|
|
public double get(int component) {
|
|
return switch (component) {
|
|
case 0 -> this.x;
|
|
case 1 -> this.y;
|
|
case 2 -> this.z;
|
|
case 3 -> this.w;
|
|
default -> throw new IllegalArgumentException("Invalid component: " + component);
|
|
};
|
|
}
|
|
|
|
@Nonnull
|
|
@Override
|
|
public String toString() {
|
|
return "Vector4d{x=" + this.x + ", y=" + this.y + ", z=" + this.z + ", w=" + this.w + "}";
|
|
}
|
|
}
|