export class Vec3 {
    static vec(x, y, z) {
        return {
            x: x,
            y: y,
            z: z
        }
    }
    static add(a, b) {
        return {
            x: a.x + b.x,
            y: a.y + b.y,
            z: a.z + b.z
        }
    }
    static sub(a, b) {
        return {
            x: a.x - b.x,
            y: a.y - b.y,
            z: a.z - b.z
        }
    }
    static neg(a) {
        return {
            x: -a.x,
            y: -a.y,
            z: -a.z
        }
    }
    static multiplyAxes(a, b) {
        return {
            x: a.x * b.x,
            y: a.y * b.y,
            z: a.z * b.z
        }
    }
    static scale(a, b) {
        return {
            x: a.x * b,
            y: a.y * b,
            z: a.z * b
        }
    }
    static normalize(a) {
        return this.scale(a, 1/this.len(a));
    }
    static dot(a, b) {
        return a.x*b.x + a.y*b.y + a.z*b.z;
    }
    static cross(a, b) {
        return {
            x: a.y*b.z - a.z*b.y,
            y: a.z*b.x - a.x*b.z,
            z: a.x*b.y - a.y*b.x
        }
    }
    static equals(a, b) {
        return a.x == b.x && a.y == b.y && a.z == b.z;
    }
    static lenSqr(a) {
        return a.x*a.x + a.y*a.y + a.z*a.z;
    }
    static len(a) {
        return Math.sqrt(this.lenSqr(a));
    }
    static lerp(a, b, t) {
        return this.add(this.scale(a, 1-t), this.scale(b, t));
    }

    static string(a) {
        return `(${a.x.toFixed(4)}, ${a.y.toFixed(4)}, ${a.z.toFixed(4)})`;
    }
}