newton
Version:
A playful, particle-based physics engine designed from the ground up for JavaScript.
48 lines (39 loc) • 1.52 kB
JavaScript
module.exports = getFrame();
function getFrame() {
var lastTime = 0;
// Browsers
if (typeof window !== 'undefined') {
var vendors = ['ms', 'moz', 'webkit', 'o'];
var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
var isFirefox = typeof InstallTrigger !== 'undefined'; // Firefox 1.0+
var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
var isChrome = !!window.chrome && !isOpera;
for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame'];
}
if (!window.requestAnimationFrame) {
window.requestAnimationFrame = timeoutFrame;
window.cancelAnimationFrame = cancelTimeoutFrame;
}
return {
onFrame: window.requestAnimationFrame.bind(window),
cancelFrame: window.cancelAnimationFrame.bind(window)
};
}
// Node
return {
onFrame: timeoutFrame,
cancelFrame: cancelTimeoutFrame
};
function timeoutFrame(simulator, element) {
var currTime = new Date().getTime();
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
var id = setTimeout(function() { simulator(currTime + timeToCall); }, timeToCall);
lastTime = currTime + timeToCall;
return id;
}
function cancelTimeoutFrame(id) {
clearTimeout(id);
}
}