169 lines
2.8 KiB
JavaScript
169 lines
2.8 KiB
JavaScript
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
THREE.Math = {
|
|
|
|
generateUUID: function () {
|
|
|
|
// http://www.broofa.com/Tools/Math.uuid.htm
|
|
|
|
var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' );
|
|
var uuid = new Array( 36 );
|
|
var rnd = 0, r;
|
|
|
|
return function () {
|
|
|
|
for ( var i = 0; i < 36; i ++ ) {
|
|
|
|
if ( i == 8 || i == 13 || i == 18 || i == 23 ) {
|
|
|
|
uuid[ i ] = '-';
|
|
|
|
} else if ( i == 14 ) {
|
|
|
|
uuid[ i ] = '4';
|
|
|
|
} else {
|
|
|
|
if ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0;
|
|
r = rnd & 0xf;
|
|
rnd = rnd >> 4;
|
|
uuid[ i ] = chars[ ( i == 19 ) ? ( r & 0x3 ) | 0x8 : r ];
|
|
|
|
}
|
|
}
|
|
|
|
return uuid.join( '' );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
// Clamp value to range <a, b>
|
|
|
|
clamp: function ( x, a, b ) {
|
|
|
|
return ( x < a ) ? a : ( ( x > b ) ? b : x );
|
|
|
|
},
|
|
|
|
// Clamp value to range <a, inf)
|
|
|
|
clampBottom: function ( x, a ) {
|
|
|
|
return x < a ? a : x;
|
|
|
|
},
|
|
|
|
// Linear mapping from range <a1, a2> to range <b1, b2>
|
|
|
|
mapLinear: function ( x, a1, a2, b1, b2 ) {
|
|
|
|
return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );
|
|
|
|
},
|
|
|
|
// http://en.wikipedia.org/wiki/Smoothstep
|
|
|
|
smoothstep: function ( x, min, max ) {
|
|
|
|
if ( x <= min ) return 0;
|
|
if ( x >= max ) return 1;
|
|
|
|
x = ( x - min ) / ( max - min );
|
|
|
|
return x * x * ( 3 - 2 * x );
|
|
|
|
},
|
|
|
|
smootherstep: function ( x, min, max ) {
|
|
|
|
if ( x <= min ) return 0;
|
|
if ( x >= max ) return 1;
|
|
|
|
x = ( x - min ) / ( max - min );
|
|
|
|
return x * x * x * ( x * ( x * 6 - 15 ) + 10 );
|
|
|
|
},
|
|
|
|
// Random float from <0, 1> with 16 bits of randomness
|
|
// (standard Math.random() creates repetitive patterns when applied over larger space)
|
|
|
|
random16: function () {
|
|
|
|
return ( 65280 * Math.random() + 255 * Math.random() ) / 65535;
|
|
|
|
},
|
|
|
|
// Random integer from <low, high> interval
|
|
|
|
randInt: function ( low, high ) {
|
|
|
|
return Math.floor( this.randFloat( low, high ) );
|
|
|
|
},
|
|
|
|
// Random float from <low, high> interval
|
|
|
|
randFloat: function ( low, high ) {
|
|
|
|
return low + Math.random() * ( high - low );
|
|
|
|
},
|
|
|
|
// Random float from <-range/2, range/2> interval
|
|
|
|
randFloatSpread: function ( range ) {
|
|
|
|
return range * ( 0.5 - Math.random() );
|
|
|
|
},
|
|
|
|
degToRad: function () {
|
|
|
|
var degreeToRadiansFactor = Math.PI / 180;
|
|
|
|
return function ( degrees ) {
|
|
|
|
return degrees * degreeToRadiansFactor;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
radToDeg: function () {
|
|
|
|
var radianToDegreesFactor = 180 / Math.PI;
|
|
|
|
return function ( radians ) {
|
|
|
|
return radians * radianToDegreesFactor;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
isPowerOfTwo: function ( value ) {
|
|
|
|
return ( value & ( value - 1 ) ) === 0 && value !== 0;
|
|
|
|
},
|
|
|
|
nextPowerOfTwo: function ( value ) {
|
|
|
|
value --;
|
|
value |= value >> 1;
|
|
value |= value >> 2;
|
|
value |= value >> 4;
|
|
value |= value >> 8;
|
|
value |= value >> 16;
|
|
value ++;
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
};
|