@threeify/math
Version:
Computer graphics oriented, High performance, tree-shakeable, TypeScript 3D vector math library.
150 lines (143 loc) • 3.7 kB
text/typescript
import {
delta,
EPSILON,
equalsTolerance,
parseSafeFloats,
toSafeString
} from './Functions';
import { Vec4 } from './Vec4';
export function vec4Delta(a: Vec4, b: Vec4): number {
return delta(a.x, b.x) + delta(a.y, b.y) + delta(a.z, b.z) + delta(a.w, b.w);
}
export function vec4Equals(
a: Vec4,
b: Vec4,
tolerance: number = EPSILON
): boolean {
return (
equalsTolerance(a.x, b.x, tolerance) &&
equalsTolerance(a.y, b.y, tolerance) &&
equalsTolerance(a.z, b.z, tolerance) &&
equalsTolerance(a.w, b.w, tolerance)
);
}
export function vec4Add(a: Vec4, b: Vec4, result = new Vec4()): Vec4 {
return result.set(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);
}
export function vec4Subtract(a: Vec4, b: Vec4, result = new Vec4()): Vec4 {
return result.set(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w);
}
export function vec4MultiplyByScalar(
a: Vec4,
b: number,
result = new Vec4()
): Vec4 {
return result.set(a.x * b, a.y * b, a.z * b, a.w * b);
}
export function vec4Negate(a: Vec4, result = new Vec4()): Vec4 {
return result.set(-a.x, -a.y, -a.z, -a.w);
}
export function vec4LengthSq(a: Vec4): number {
return vec4Dot(a, a);
}
export function vec4Length(a: Vec4): number {
return Math.sqrt(vec4Dot(a, a));
}
export function vec4Distance(a: Vec4, b: Vec4): number {
// TODO: optimize this by breaking it apart
return vec4Length(vec4Subtract(a, b));
}
export function vec4DistanceSq(a: Vec4, b: Vec4): number {
// TODO: optimize this by breaking it apart
return vec4LengthSq(vec4Subtract(a, b));
}
export function vec4Normalize(a: Vec4, result = new Vec4()): Vec4 {
const length = vec4Length(a);
if (length === 0) {
return result.set(0, 0, 0, 0);
}
return vec4MultiplyByScalar(a, 1 / length, result);
}
export function vec4Min(a: Vec4, b: Vec4, result = new Vec4()): Vec4 {
return result.set(
Math.min(a.x, b.x),
Math.min(a.y, b.y),
Math.min(a.z, b.z),
Math.min(a.w, b.w)
);
}
export function vec4Max(a: Vec4, b: Vec4, result = new Vec4()): Vec4 {
return result.set(
Math.max(a.x, b.x),
Math.max(a.y, b.y),
Math.max(a.z, b.z),
Math.max(a.w, b.w)
);
}
export function vec4MaxComponent(a: Vec4): number {
return Math.max(a.x, a.y, a.z, a.w);
}
export function vec4MinComponent(a: Vec4): number {
return Math.min(a.x, a.y, a.z, a.w);
}
export function vec4Ceil(a: Vec4, result = new Vec4()): Vec4 {
return result.set(
Math.ceil(a.x),
Math.ceil(a.y),
Math.ceil(a.z),
Math.ceil(a.w)
);
}
export function vec4Floor(a: Vec4, result = new Vec4()): Vec4 {
return result.set(
Math.floor(a.x),
Math.floor(a.y),
Math.floor(a.z),
Math.floor(a.w)
);
}
export function vec4Dot(a: Vec4, b: Vec4): number {
return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
}
export function vec4Lerp(
a: Vec4,
b: Vec4,
t: number,
result = new Vec4()
): Vec4 {
const s = 1 - t;
return result.set(
a.x * s + b.x * t,
a.y * s + b.y * t,
a.z * s + b.z * t,
a.w * s + b.w * t
);
}
export function arrayToVec4(
array: Float32Array | number[],
offset = 0,
result = new Vec4()
): Vec4 {
return result.set(
array[offset + 0],
array[offset + 1],
array[offset + 2],
array[offset + 3]
);
}
export function vec4ToArray(
a: Vec4,
array: Float32Array | number[],
offset = 0
): void {
array[offset + 0] = a.x;
array[offset + 1] = a.y;
array[offset + 2] = a.z;
array[offset + 3] = a.w;
}
export function vec4ToString(a: Vec4): string {
return toSafeString([a.x, a.y, a.z, a.w]);
}
export function stringToVec4(text: string, result = new Vec4()): Vec4 {
return arrayToVec4(parseSafeFloats(text), 0, result);
}