Advertisement
gaz_lloyd

Untitled

Jul 11th, 2016
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // 3D/2D viewer
  2. $('#switch-to-3d').click(function() {
  3.     $('.container-2d').hide();
  4.     $('.viewer-3d, .viewer-3d-multi, .buttons-container-3d').show();
  5. });
  6.  
  7. $('#switch-to-2d').click(function() {
  8.     $('.viewer-3d, .viewer-3d-multi, .buttons-container-3d').hide();
  9.     $('.container-2d').show();
  10. });
  11.  
  12. // 3D model viewer
  13. var viewer3d = {
  14.     dragging: null,
  15.     draggingFrameX: 0,
  16.     draggingFrameY: 0,
  17.     viewers: [],
  18.     frameThresholdX: 10,
  19.     frameThresholdY: 128,
  20.     realMod: function(x, y) {
  21.         return ((x % y) + y) % y;
  22.     },
  23.     init: function() {
  24.         $('.viewer-3d').each(viewer3d.bind);
  25.         $(document).mouseup(viewer3d.release);
  26.         $(document).mousemove(viewer3d.move);
  27.     },
  28.     bind: function() {
  29.         var v = $(this);
  30.         var num = viewer3d.viewers.length;
  31.         var allModels = [];
  32.         var modelID = 0;
  33.         var viewerSize = 0;
  34.         while(true) {
  35.             var modelMap = v.find('.viewer-3d-map-' + modelID);
  36.             var urlNode = v.find('.viewer-3d-url-' + modelID);
  37.             if(!modelMap.length || !urlNode.length) break;
  38.             var url = $('<div/>').html(urlNode.text()).text();
  39.             var framesS = $('<div/>').html(modelMap.text()).text().replace(/^\s+|\s+$/g).split(/,/g);
  40.             var frameMap = [];
  41.             var heightMap = [];
  42.             var leftCropMap = [];
  43.             var totalW = parseInt(framesS[0]);
  44.             var maxFrameW = parseInt(framesS[1]);
  45.             var totalH = parseInt(framesS[2]);
  46.             var verticalSteps = parseInt(framesS[3]);
  47.             var midVertical = Math.floor(verticalSteps / 2);
  48.             for(var f = 4; f < framesS.length; f += 3) {
  49.                 frameMap.push(parseInt(framesS[f]));
  50.                 heightMap.push(parseInt(framesS[f + 1]));
  51.                 leftCropMap.push(parseInt(framesS[f + 2]));
  52.             }
  53.             allModels.push({
  54.                 imageURL: url,
  55.                 map: frameMap,
  56.                 cropMap: leftCropMap,
  57.                 totalWidth: totalW,
  58.                 totalHeight: totalH,
  59.                 maxFrameWidth: maxFrameW,
  60.                 xStep: verticalSteps
  61.             });
  62.             viewerSize = Math.max(viewerSize, totalH, maxFrameW);
  63.             modelID++;
  64.         }
  65.         if(!modelID) return;
  66.         var overlayNode = $('<div class="viewer-3d-overlay"></div>');
  67.         var frameN = v.find('.viewer-3d-frame');
  68.         v.find('img').detach();
  69.         var klasses = v.attr('class').split(/ /g);
  70.         var startFrame = 0;
  71.         for(var k in klasses) {
  72.             if(klasses[k].substr(0, 11) == 'startframe-') {
  73.                 startFrame = Math.max(0, parseInt(klasses[k].substr(11)));
  74.             }
  75.         }
  76.         var viewer = {
  77.             node: v,
  78.             frameX: startFrame,
  79.             frameY: midVertical,
  80.             models: allModels,
  81.             currentModel: -1,
  82.             frameNode: frameN,
  83.             width: viewerSize,
  84.             height: viewerSize,
  85.             mouseX: 0,
  86.             mouseY: 0,
  87.             overlay: overlayNode
  88.         };
  89.         viewer3d.viewers.push(viewer);
  90.         v.hover(viewer3d.hover, viewer3d.unhover).mousedown(viewer3d.drag).append(overlayNode).attr('data-id', num).css({
  91.             width: viewer.width + 'px',
  92.             height: viewer.height + 'px'
  93.         });
  94.         frameN.mousedown(viewer3d.drag).attr('data-id', num).css('height', viewer.height + 'px');
  95.         viewer3d.changeVersion(viewer, 0);
  96.     },
  97.     getCurrentModel: function(v) {
  98.         return v.models[v.currentModel];
  99.     },
  100.     changeVersion: function(v, version) {
  101.         version = Math.max(0, Math.min(v.models.length - 1, version));
  102.         if(v.currentModel == version) return;
  103.         v.currentModel = version;
  104.         v.frameNode.css('background', 'url(' + viewer3d.getCurrentModel(v).imageURL + ') top left no-repeat');
  105.         viewer3d.display(v, v.frameX, v.frameY);
  106.     },
  107.     hover: function(e) {
  108.         var v = viewer3d.getViewer(this);
  109.         if(viewer3d.dragging != v) {
  110.             v.overlay.animate({'opacity': '1'}, 'fast');
  111.         }
  112.     },
  113.     unhover: function(e) {
  114.         var v = viewer3d.getViewer(this);
  115.         if(viewer3d.dragging != v) {
  116.             v.overlay.animate({'opacity': '0.5'}, 'fast');
  117.         }
  118.     },
  119.     drag: function(e) {
  120.         var v = viewer3d.getViewer(this);
  121.         v.mouseX = e.pageX;
  122.         v.mouseY = e.pageY;
  123.         viewer3d.dragging = v;
  124.         draggingFrameX = v.frameX;
  125.         draggingFrameY = v.frameY;
  126.         return false;
  127.     },
  128.     release: function() {
  129.         var v = viewer3d.dragging;
  130.         viewer3d.dragging = null;
  131.         if(v != null) {
  132.             v.frameX = viewer3d.draggingFrameX;
  133.             v.frameY = viewer3d.draggingFrameY;
  134.             v.overlay.animate({'opacity': '0.5'}, 'fast');
  135.         }
  136.         viewer3d.draggingFrameX = 0;
  137.         viewer3d.draggingFrameY = 0;
  138.     },
  139.     getViewer: function(node) {
  140.         return viewer3d.viewers[parseInt($(node).attr('data-id'))];
  141.     },
  142.     display: function(v, frameX, frameY) {
  143.         var model = viewer3d.getCurrentModel(v);
  144.         var frameID = viewer3d.realMod(frameX * model.xStep + frameY, model.map.length);
  145.         var frameOffset = model.map[frameID];
  146.         var frameWidth = 0;
  147.         if(frameID == model.map.length - 1) {
  148.             frameWidth = model.totalWidth - frameOffset;
  149.         } else {
  150.             frameWidth = model.map[frameID + 1] - frameOffset;
  151.         }
  152.         v.frameNode.css({
  153.             backgroundPosition: (-frameOffset - frameID) + 'px 0px',
  154.             left: Math.round((v.width - model.maxFrameWidth) / 2.0 + model.cropMap[frameID]) + 'px',
  155.             top: Math.round((v.height - model.totalHeight) / 2) + 'px',
  156.             width: frameWidth + 'px',
  157.             height: model.totalHeight + 'px'
  158.         });
  159.     },
  160.     move: function(e) {
  161.         if(viewer3d.dragging == null) {
  162.             return;
  163.         }
  164.         var v = viewer3d.dragging;
  165.         var model = viewer3d.getCurrentModel(v);
  166.         var mouseDeltaX = e.pageX - v.mouseX;
  167.         var mouseDeltaY = e.pageY - v.mouseY;
  168.         var frameDeltaX = Math.round(mouseDeltaX / viewer3d.frameThresholdX);
  169.         var frameDeltaY = -Math.round(mouseDeltaY / viewer3d.frameThresholdY);
  170.         viewer3d.draggingFrameX = v.frameX + frameDeltaX;
  171.         viewer3d.draggingFrameY = Math.max(0, Math.min(model.xStep - 1, v.frameY + frameDeltaY));
  172.         viewer3d.display(v, viewer3d.draggingFrameX, viewer3d.draggingFrameY);
  173.     }
  174. };
  175. $(viewer3d.init);
  176. var selector3d = {
  177.     bind: function() {
  178.         var viewer = viewer3d.getViewer($(this).find('.viewer-3d'));
  179.         var keepGoing = true;
  180.         var modelVariant = 0;
  181.         var selector;
  182.         while(keepGoing) {
  183.             selector = $(this).find('.selector-' + modelVariant);
  184.             if(selector.length) {
  185.                 selector.attr('data-variant', modelVariant).click(function() {
  186.                     viewer3d.changeVersion(viewer, parseInt($(this).attr('data-variant')));
  187.                     return false;
  188.                 });
  189.             }
  190.             modelVariant++;
  191.             keepGoing = selector.length;
  192.         }
  193.     },
  194.     init: function() {
  195.         $('.viewer-3d-multi, .viewer-3d-container').each(selector3d.bind);
  196.     }
  197. };
  198. $(selector3d.init);
  199.  
  200. // Code to get 3D viewer drag working on touch devices
  201. // Source: http://www.jquery4u.com/mobile/jquery-add-dragtouch-support-ipad/
  202. $.fn.addTouch = function(){
  203.     this.each(function(i,el){
  204.       $(el).bind('touchstart touchmove touchend touchcancel',function(){
  205.         //we pass the original event object because the jQuery event
  206.         //object is normalized to w3c specs and does not provide the TouchList
  207.         handleTouch(event);
  208.       });
  209.     });
  210.  
  211.     var handleTouch = function(event)
  212.     {
  213.       var touches = event.changedTouches,
  214.               first = touches[0],
  215.               type = '';
  216.  
  217.       switch(event.type)
  218.       {
  219.         case 'touchstart':
  220.           type = 'mousedown';
  221.           break;
  222.  
  223.         case 'touchmove':
  224.           type = 'mousemove';
  225.           event.preventDefault();
  226.           break;
  227.  
  228.         case 'touchend':
  229.           type = 'mouseup';
  230.           break;
  231.  
  232.         default:
  233.           return;
  234.       }
  235.  
  236.       var simulatedEvent = document.createEvent('MouseEvent');
  237.       simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY, false, false, false, false, 0/*left*/, null);
  238.       first.target.dispatchEvent(simulatedEvent);
  239.     };
  240.   };
  241.  
  242. $('.viewer-3d').addTouch();
  243.  
  244. // End 3D viewer touch device code
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement