Advertisement
jegtheme

Fps

Sep 7th, 2015
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /** jquery.jresponsive360.js **/
  2. (function ($) {
  3.     "use strict";
  4.  
  5.     $.fn.responsive360 = function (options) {
  6.  
  7.         options = $.extend({
  8.             imgarray: new Array(),
  9.             imgpath: '',
  10.             imgcount: 1,
  11.  
  12.             invert: true,
  13.             infiniteAxis: [true, false],
  14.             fps: 20,
  15.  
  16.             grabbable: true,
  17.             grabRotateDistance: 500,
  18.  
  19.             throwable: true,
  20.             minThrowDuration: 0.5,
  21.             maxThrowDuration: 1.5,
  22.  
  23.             autoplay: 1
  24.         }, options);
  25.  
  26.  
  27.         return $(this).each(function () {
  28.             var element = this;
  29.             var percenttext = $(".loadpercentage", this).data("percent");
  30.  
  31.             var initialize = function () {
  32.                 if (joption.ismobile) {
  33.                     // strip to bare-bones
  34.                     options.throwable = false;
  35.  
  36.                     element.mobileStrings = {
  37.                         mousedown: 'touchstart',
  38.                         mousemove: 'touchmove',
  39.                         mouseup: 'touchend'
  40.                     };
  41.                 }
  42.  
  43.                 element.totalFrames = convertToArray(options.imgarray.length, 1);
  44.  
  45.                 element.frames = [];
  46.                 for (var i = 0; i < element.totalFrames[0]; i++) {
  47.                     element.frames[i] = [];
  48.                 }
  49.  
  50.                 // options conversions
  51.                 element.playIntervalDuration = 1000 / options.fps;
  52.                 element.minSpinIntervalDuration = (options.minSpinDuration * 1000) / options.imgarray.length;
  53.                 element.minThrowFrames = Math.floor(options.minThrowDuration * options.fps);
  54.                 element.maxThrowFrames = Math.floor(options.maxThrowDuration * options.fps);
  55.  
  56.                 // state
  57.                 element.currentPos = [0, 0];
  58.                 element.playing = false;
  59.                 element.grabbing = false;
  60.                 element.spinning = false;
  61.  
  62.                 if (options.invert) {
  63.                     options.imgarray.reverse();
  64.                 }
  65.  
  66.                 // binding
  67.                 bindbehaviour();
  68.  
  69.                 // autoplay
  70.                 startautoplay();
  71.             };
  72.  
  73.  
  74.             var lastTime = 0;
  75.             var speed = Math.floor(1000/options.fps);
  76.             var requestAnimationFrame = function (callback) {
  77.                 var currTime = new Date().getTime();
  78.                 var timeToCall = Math.max(0, speed - (currTime - lastTime));
  79.                 console.log(timeToCall);
  80.                 var id = window.setTimeout(function () {
  81.                         callback(currTime + timeToCall);
  82.                     },
  83.                     timeToCall);
  84.                 lastTime = currTime + timeToCall;
  85.                 return id;
  86.             };
  87.  
  88.             var cancelAnimationFrame = function (id) {
  89.                 clearTimeout(id);
  90.             };
  91.  
  92.             /** autoplay **/
  93.             var autoplayinterval = null;
  94.             var intervalcounter = 0;
  95.  
  96.             var doautoplay = function () {
  97.                 gotoPos([validatePos(intervalcounter++), 0]);
  98.                 autoplayinterval = requestAnimationFrame(doautoplay);
  99.             };
  100.  
  101.             var stopautoplay = function () {
  102.                 if (options.autoplay && autoplayinterval !== null) {
  103.                     cancelAnimationFrame(autoplayinterval);
  104.                     autoplayinterval = null;
  105.                 }
  106.             };
  107.  
  108.             $(window).bind('stopautoplay360', stopautoplay);
  109.  
  110.             var startautoplay = function () {
  111.                 if (options.autoplay) {
  112.                     autoplayinterval = requestAnimationFrame(doautoplay);
  113.                 }
  114.             };
  115.             /** autoplay end **/
  116.  
  117.  
  118.             var getStr = function (str) {
  119.                 return joption.ismobile ? element.mobileStrings[str] : str;
  120.             };
  121.  
  122.             var getEvent = function (event) {
  123.                 if (event.originalEvent.touches) {
  124.                     // ignore multi-touch
  125.                     if (event.originalEvent.touches.length > 1) return false;
  126.  
  127.                     if (event.originalEvent.touches.length) {
  128.                         event.clientX = event.originalEvent.touches[0].clientX;
  129.                         event.clientY = event.originalEvent.touches[0].clientY;
  130.                     }
  131.                 }
  132.                 return event;
  133.             };
  134.  
  135.  
  136.             var bindbehaviour = function () {
  137.                 if (options.grabbable) {
  138.                     $(element).bind(getStr("mousedown"), onGrabStart);
  139.                 }
  140.             };
  141.  
  142.             var cancleEndGrab = function () {
  143.                 element.grabbing = false;
  144.                 $(window).unbind(getStr('mousemove'), onGrabChange);
  145.                 $(window).unbind(getStr('mouseup'), onGrabEnd);
  146.                 clearInterval(element.grabHistoryInterval);
  147.                 stopThrowing();
  148.             };
  149.  
  150.             var onGrabStart = function (event) {
  151.                 if (!(event = getEvent(event))) return;
  152.                 stopautoplay();
  153.  
  154.                 cancleEndGrab();
  155.                 element.grabbing = true;
  156.                 $(window).bind(getStr('mousemove'), onGrabChange);
  157.                 $(window).bind(getStr('mouseup'), onGrabEnd);
  158.                 $('body').addClass('dragging');
  159.  
  160.                 if (joption.ismobile) {
  161.                     $(element).bind('touchmove', onGrabChange);
  162.                     $(element).bind('touchend', onGrabEnd);
  163.                 }
  164.  
  165.                 element.grabHistory = [event];
  166.                 element.onGrabChangeClientX = element.onGrabChangeClientY = null;
  167.                 element.grabHistoryInterval = setInterval(updateGrabHistory, 10);
  168.  
  169.                 // save state for later
  170.                 element.onGrabStartClientX = event.clientX;
  171.                 element.onGrabStartClientY = event.clientY;
  172.                 element.onGrabStartPlaying = element.playing;
  173.                 element.onGrabStartPos = element.currentPos;
  174.  
  175.                 // prevent default event behavior
  176.                 event.preventDefault();
  177.             };
  178.  
  179.             var updateGrabHistory = function () {
  180.                 var func = element.onGrabChangeClientX ? "onGrabChange" : "onGrabStart";
  181.  
  182.                 if (func === "onGrabChange") {
  183.                     element.grabHistory.unshift({ clientX: element.onGrabChangeClientX, clientY: element.onGrabChangeClientY });
  184.                 } else if (func === "onGrabStart") {
  185.                     element.grabHistory.unshift({ clientX: element.onGrabStartClientX, clientY: element.onGrabStartClientY });
  186.                 }
  187.  
  188.                 if (element.grabHistory.length > 3) {
  189.                     element.grabHistory.splice(3);
  190.                 }
  191.             };
  192.  
  193.             var onGrabChange = function (event) {
  194.                 if (!(event = getEvent(event))) return;
  195.  
  196.                 if (!(event.clientX == element.onGrabStartClientX && event.clientY == element.onGrabStartClientY)) {
  197.  
  198.                     // save the event for later
  199.                     element.onGrabChangeClientX = event.clientX;
  200.                     element.onGrabChangeClientY = event.clientY;
  201.  
  202.                     var pos = getGrabPos(event);
  203.                     if (pos) gotoPos(pos);
  204.                 }
  205.  
  206.                 event.preventDefault();
  207.             };
  208.  
  209.             var onGrabEnd = function (event) {
  210.                 if (!(event = getEvent(event))) return;
  211.  
  212.                 element.grabbing = false;
  213.                 $(window).unbind(getStr('mousemove'), onGrabChange);
  214.                 $(window).unbind(getStr('mouseup'), onGrabEnd);
  215.                 $('body').removeClass('dragging');
  216.                 clearInterval(element.grabHistoryInterval);
  217.  
  218.                 if (options.throwable) {
  219.                     var diffX = event.clientX - element.grabHistory[element.grabHistory.length - 1].clientX,
  220.                         diffY = event.clientY - element.grabHistory[element.grabHistory.length - 1].clientY,
  221.                         loaded = true;
  222.  
  223.                     if (diffX || diffY) {
  224.                         var dist = Math.sqrt(Math.pow(diffX, 2) + Math.pow(diffY, 2)),
  225.                             frames = Math.floor(dist / 5),
  226.                             clientX = element.grabHistory[element.grabHistory.length - 1].clientX,
  227.                             clientY = element.grabHistory[element.grabHistory.length - 1].clientY,
  228.                             changeX = true,
  229.                             changeY = true;
  230.  
  231.                         // keep # of frames in-bounds
  232.                         if (frames < element.minThrowFrames) frames = element.minThrowFrames;
  233.                         else if (frames > element.maxThrowFrames) frames = element.maxThrowFrames;
  234.  
  235.                         element.throwSequence = new Array();
  236.  
  237.                         for (var i = 0; i < frames; i++) {
  238.                             var percent = i / frames,
  239.                                 speed = Math.pow(percent - 1, 2),
  240.                                 clientX = Math.floor(speed * diffX) + clientX,
  241.                                 clientY = Math.floor(speed * diffY) + clientY,
  242.                                 pos = validatePos(getGrabPos({ clientX: clientX, clientY: clientY }));
  243.  
  244.                             // once an axis rotates slowly enough to use the same row/column for two frames,
  245.                             // stop rotating that axis entirely
  246.                             if (!changeX) pos[0] = element.throwSequence[element.throwSequence.length - 1][0];
  247.                             else if (element.throwSequence.length && pos[0] == element.throwSequence[element.throwSequence.length - 1][0]) changeX = false;
  248.                             if (!changeY) pos[1] = element.throwSequence[element.throwSequence.length - 1][1];
  249.                             else if (element.throwSequence.length && pos[1] == element.throwSequence[element.throwSequence.length - 1][1]) changeY = false;
  250.  
  251.                             element.throwSequence.push(pos);
  252.                         }
  253.  
  254.                         element.throwing = true;
  255.                         element.throwInterval = requestAnimationFrame(throwStep);
  256.                     }
  257.                 }
  258.  
  259.                 event.preventDefault();
  260.             };
  261.  
  262.             var throwStep = function () {
  263.                 var pos = element.throwSequence.shift();
  264.                 gotoPos(pos);
  265.                 if (!element.throwSequence.length) {
  266.                     stopThrowing();
  267.                 } else {
  268.                     element.throwInterval = requestAnimationFrame(throwStep);
  269.                 }
  270.             };
  271.  
  272.             var stopThrowing = function () {
  273.                 if (!element.throwing) return;
  274.                 element.throwing = false;
  275.                 cancelAnimationFrame(element.throwInterval);
  276.             };
  277.  
  278.             var getGrabPos = function (event) {
  279.                 var diffX = event.clientX - element.onGrabStartClientX,
  280.                     diffY = event.clientY - element.onGrabStartClientY,
  281.                     percentDiffX = diffX / options.grabRotateDistance,
  282.                     percentDiffY = diffY / options.grabRotateDistance,
  283.                     frameDiffX = Math.round(element.totalFrames[0] * percentDiffX),
  284.                     frameDiffY = Math.round(element.totalFrames[1] * percentDiffY),
  285.                     posX = element.onGrabStartPos[0] + frameDiffX,
  286.                     posY = element.onGrabStartPos[1] + frameDiffY;
  287.  
  288.                 return [posX, posY];
  289.             };
  290.  
  291.             var atPosition = function (pos) {
  292.                 return (element.currentPos && pos[0] == element.currentPos[0] && pos[1] == element.currentPos[1]);
  293.             };
  294.  
  295.             var validatePos = function (pos, forceContinuous) {
  296.                 for (var i = 0; i < 2; i++) {
  297.                     if (forceContinuous || options.infiniteAxis[i]) {
  298.                         while (pos[i] > element.totalFrames[i] - 1) {
  299.                             pos[i] -= element.totalFrames[i];
  300.                         }
  301.                         while (pos[i] < 0) {
  302.                             pos[i] += element.totalFrames[i];
  303.                         }
  304.                     } else {
  305.                         if (pos[i] > element.totalFrames[i] - 1) {
  306.                             pos[i] = element.totalFrames[i] - 1;
  307.                         }
  308.                         if (pos[i] < 0) {
  309.                             pos[i] = 0;
  310.                         }
  311.                     }
  312.                 }
  313.                 return pos;
  314.             };
  315.  
  316.             var gotoPos = function (pos, force) {
  317.                 // keep the pos in bounds
  318.                 pos = validatePos(pos);
  319.                 element.currentPos = pos;
  320.                 $(element.imageholder).attr('src', options.imgarray[pos[0]]);
  321.             };
  322.  
  323.  
  324.             var convertToArray = function (mixed, second) {
  325.                 return (typeof mixed[0] == 'undefined') ? [mixed, second] : mixed;
  326.             };
  327.  
  328.             var changepercentage = function (sequence) {
  329.  
  330.                 if (sequence < options.imgarray.length) {
  331.                     var percentage = Math.floor(( sequence + 1) / options.imgarray.length * 100);
  332.                     $(".loadpercentage", element).text(percentage + " " + percenttext);
  333.                 } else {
  334.                     $(".loadpercentage", element).fadeOut(function () {
  335.                         $(this).remove();
  336.                         $(element).append("<div class='wrapper360'><img class='image360' src='" + options.imgarray[0] + "'/></div>");
  337.                         element.imageholder = $(element).find("img").fadeIn();
  338.                         initialize();
  339.                     });
  340.                 }
  341.             };
  342.  
  343.             var preloadImage = function () {
  344.                 var i;
  345.                 var loaded = 0;
  346.                 for(i = 0; i < options.imgcount; i++ ){
  347.                     var img = new Image();
  348.                     $(img).load(function () {
  349.                         changepercentage(++loaded);
  350.                     }).error(function () {
  351.                         changepercentage(++loaded);
  352.                     }).attr('src', options.imgarray[i]);
  353.                 }
  354.  
  355.             };
  356.  
  357.             var buildImageArray = function () {
  358.                 if (!options.imgarray.length) {
  359.                     var imagePathParts = options.imgpath.match(/^([^#]*)(#+)([^#]*)$/);
  360.                     var numDigits = imagePathParts[2].length;
  361.  
  362.                     for (var i = 0; i < options.imgcount; i++) {
  363.                         var frame = (i + 1).toString();
  364.                         for (var j = frame.length; j < numDigits; j++) {
  365.                             frame = '0' + frame;
  366.                         }
  367.                         options.imgarray[i] = imagePathParts[1] + frame + imagePathParts[3];
  368.                     }
  369.                 }
  370.             };
  371.  
  372.             buildImageArray();
  373.             preloadImage();
  374.         });
  375.     };
  376.  
  377. })(jQuery);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement