/** * This file houses miscellaneous helper functions and constants. */ var nullptr = 0; // emscripten doesn't like to take null as uintptr_t function radiansToDegrees(rad) { return (rad / Math.PI) * 180; } function degreesToRadians(deg) { return (deg / 180) * Math.PI; } // See https://stackoverflow.com/a/31090240 // This contraption keeps closure from minifying away the check // if btoa is defined *and* prevents runtime 'btoa' or 'window' is not defined. // Defined outside any scopes to make it available in all files. var isNode = !(new Function('try {return this===window;}catch(e){ return false;}')()); function almostEqual(floata, floatb) { return Math.abs(floata - floatb) < 0.00001; } function saveBytesToFile(bytes, fileName) { if (!isNode) { // https://stackoverflow.com/a/32094834 var blob = new Blob([bytes], {type: 'application/octet-stream'}); url = window.URL.createObjectURL(blob); var a = document.createElement('a'); document.body.appendChild(a); a.href = url; a.download = fileName; a.click(); // clean up after because FF might not download it synchronously setTimeout(function() { URL.revokeObjectURL(url); a.remove(); }, 50); } else { var fs = require('fs'); // https://stackoverflow.com/a/42006750 // https://stackoverflow.com/a/47018122 fs.writeFile(fileName, new Buffer(bytes), function(err) { if (err) throw err; }); } }