mdx-m3-viewer
Version:
A browser WebGL model viewer. Mainly focused on models of the games Warcraft 3 and Starcraft 2.
135 lines (113 loc) • 3.08 kB
text/typescript
/**
* Convert from degrees to radians.
*/
export function degToRad(degrees: number) {
return degrees * (Math.PI / 180);
}
/**
* Convert from radians to degrees.
*/
export function radToDeg(radians: number) {
return radians * (180 / Math.PI);
}
/**
* Gets a random number between a range.
*/
export function randomInRange(a: number, b: number) {
return a + Math.random() * (b - a);
}
/**
* Clamp a number in a range.
*/
export function clamp(x: number, minVal: number, maxVal: number) {
return Math.min(Math.max(x, minVal), maxVal);
}
/**
* Linear interpolation.
*/
export function lerp(a: number, b: number, t: number) {
return a + t * (b - a);
}
/**
* Hermite interpolation.
*/
export function hermite(a: number, b: number, c: number, d: number, t: number) {
let factorTimes2 = t * t;
let factor1 = factorTimes2 * (2 * t - 3) + 1;
let factor2 = factorTimes2 * (t - 2) + t;
let factor3 = factorTimes2 * (t - 1);
let factor4 = factorTimes2 * (3 - 2 * t);
return (a * factor1) + (b * factor2) + (c * factor3) + (d * factor4);
}
/**
* Bezier interpolation.
*/
export function bezier(a: number, b: number, c: number, d: number, t: number) {
let invt = 1 - t;
let factorTimes2 = t * t;
let inverseFactorTimesTwo = invt * invt;
let factor1 = inverseFactorTimesTwo * invt;
let factor2 = 3 * t * inverseFactorTimesTwo;
let factor3 = 3 * factorTimes2 * invt;
let factor4 = factorTimes2 * t;
return (a * factor1) + (b * factor2) + (c * factor3) + (d * factor4);
}
/**
* Copies the sign of one number onto another.
*/
export function copysign(x: number, y: number) {
let signy = Math.sign(y);
if (signy === 0) {
return 0;
}
let signx = Math.sign(x);
if (signx !== signy) {
return -x;
}
return x;
}
/**
* Gets the closest power of two bigger or equal to the given number.
*/
export function powerOfTwo(x: number) {
x--;
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
x++;
return x;
}
/**
* Is this number a power of two?
*/
export function isPowerOfTwo(x: number) {
if (x === 0) {
return false;
}
return ((x & (x - 1)) === 0);
}
/**
* Given a number, truncates digits after the decimal point.
* The given precision should be in base 10.
* E.g. for a precision of two digits after the decimal point, the precision should be 100.
* The result is returned as a string.
*/
export function floatDecimals(value: number, precision: number) {
return `${Math.trunc(value * precision) / precision}`;
}
/**
* Uses floatDecimals on a typed array, and returns its string representation.
*/
export function floatArrayDecimals(value: TypedArray, precision: number) {
if (value instanceof Float32Array) {
let array = [];
for (let i = 0, l = value.length; i < l; i++) {
array[i] = floatDecimals(value[i], precision);
}
return array.join(', ');
} else {
return value.join(', ');
}
}