Source: base.js

var _lut = [];
for (var i = 0; i < 256; i++) {
	_lut[i] = (i < 16 ? '0' : '') + (i).toString(16);
}

/**
 * Method for generate uuid.
 * ( http://www.broofa.com/Tools/Math.uuid.htm )
 * @method
 * @name zen3d.generateUUID
 * @return {string} - The uuid.
 */
export function generateUUID() {
	// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136

	const d0 = Math.random() * 0xffffffff | 0;
	const d1 = Math.random() * 0xffffffff | 0;
	const d2 = Math.random() * 0xffffffff | 0;
	const d3 = Math.random() * 0xffffffff | 0;
	const uuid = _lut[d0 & 0xff] + _lut[d0 >> 8 & 0xff] + _lut[d0 >> 16 & 0xff] + _lut[d0 >> 24 & 0xff] + '-' +
		_lut[d1 & 0xff] + _lut[d1 >> 8 & 0xff] + '-' + _lut[d1 >> 16 & 0x0f | 0x40] + _lut[d1 >> 24 & 0xff] + '-' +
		_lut[d2 & 0x3f | 0x80] + _lut[d2 >> 8 & 0xff] + '-' + _lut[d2 >> 16 & 0xff] + _lut[d2 >> 24 & 0xff] +
		_lut[d3 & 0xff] + _lut[d3 >> 8 & 0xff] + _lut[d3 >> 16 & 0xff] + _lut[d3 >> 24 & 0xff];

	// .toUpperCase() here flattens concatenated strings to save heap memory space.
	return uuid.toUpperCase();
}

/**
 * Is this number a power of two.
 * @method
 * @name zen3d.isPowerOfTwo
 * @param {number} value - The input number.
 * @return {boolean} - Is this number a power of two.
 */
export function isPowerOfTwo(value) {
	return (value & (value - 1)) === 0 && value !== 0;
}

/**
 * Return the nearest power of two number of this number.
 * @method
 * @name zen3d.nearestPowerOfTwo
 * @param {number} value - The input number.
 * @return {number} - The result number.
 */
export function nearestPowerOfTwo(value) {
	return Math.pow(2, Math.round(Math.log(value) / Math.LN2));
}

/**
 * Return the next power of two number of this number.
 * @method
 * @name zen3d.nextPowerOfTwo
 * @param {number} value - The input number.
 * @return {number} - The result number.
 */
export function nextPowerOfTwo(value) {
	value--;
	value |= value >> 1;
	value |= value >> 2;
	value |= value >> 4;
	value |= value >> 8;
	value |= value >> 16;
	value++;

	return value;
}

/**
 * Clone Object of Uniforms.
 * @method
 * @name zen3d.cloneUniforms
 * @param {Object} value - The input uniforms.
 * @return {Object} - The result uniforms.
 */
export function cloneUniforms(uniforms_src) {
	var uniforms_dst = {};

	for (var name in uniforms_src) {
		var uniform_src = uniforms_src[name];
		// TODO zen3d object clone
		if (Array.isArray(uniform_src)) {
			uniforms_dst[name] = uniform_src.slice();
		} else {
			uniforms_dst[name] = uniform_src;
		}
	}

	return uniforms_dst;
}