package com.flansmod.common.vector; import java.nio.FloatBuffer; import net.minecraft.util.Vec3; public class Vector3i extends Vector { private static final long serialVersionUID = 1L; public int x, y, z; public Vector3i() { super(); } public Vector3i(int x, int y, int z) { set(x, y, z); } public Vector3i(Vec3 vec) { this((int)vec.xCoord, (int)vec.yCoord, (int)vec.zCoord); } public Vector3i(double x, double y, double z) { this((int)x, (int)y, (int)z); } public Vector3i(Vector3i v) { this(v.x, v.y, v.z); } public Vec3 toVec3() { return new Vec3(x, y, z); } public void set(int x, int y, int z) { this.x = x; this.y = y; this.z = z; } public float lengthSquared() { return x * x + y * y + z * z; } public Vector3i translate(int x, int y, int z) { this.x += x; this.y += y; this.z += z; return this; } public static Vector3i add(Vector3i left, Vector3i right, Vector3i dest) { if (dest == null) return new Vector3i(left.x + right.x, left.y + right.y, left.z + right.z); else { dest.set(left.x + right.x, left.y + right.y, left.z + right.z); return dest; } } public static Vector3i sub(Vector3i left, Vector3i right, Vector3i dest) { if (dest == null) return new Vector3i(left.x - right.x, left.y - right.y, left.z - right.z); else { dest.set(left.x - right.x, left.y - right.y, left.z - right.z); return dest; } } public static Vector3i cross(Vector3i left, Vector3i right, Vector3i dest) { if (dest == null) dest = new Vector3i(); dest.set( left.y * right.z - left.z * right.y, right.x * left.z - right.z * left.x, left.x * right.y - left.y * right.x ); return dest; } public Vector negate() { x = -x; y = -y; z = -z; return this; } public Vector3i negate(Vector3i dest) { if (dest == null) dest = new Vector3i(); dest.x = -x; dest.y = -y; dest.z = -z; return dest; } public Vector3i normalise(Vector3i dest) { float l = length(); if (dest == null) dest = new Vector3i(x / l, y / l, z / l); else dest.set((int)(x / l), (int)(y / l), (int)(z / l)); return dest; } public static float dot(Vector3i left, Vector3i right) { return left.x * right.x + left.y * right.y + left.z * right.z; } public static float angle(Vector3i a, Vector3i b) { float dls = dot(a, b) / (a.length() * b.length()); if (dls < -1f) dls = -1f; else if (dls > 1.0f) dls = 1.0f; return (float)Math.acos(dls); } public Vector load(FloatBuffer buf) { x = (int)buf.get(); y = (int)buf.get(); z = (int)buf.get(); return this; } public Vector scale(float scale) { x *= scale; y *= scale; z *= scale; return this; } public Vector store(FloatBuffer buf) { buf.put(x); buf.put(y); buf.put(z); return this; } public String toString() { return "Vector3i[" + x + ", " + y + ", " + z + ']'; } public final int getX() { return x; } public final int getY() { return y; } public final void setX(int x) { this.x = x; } public final void setY(int y) { this.y = y; } public void setZ(int z) { this.z = z; } public int getZ() { return z; } }