UNPKG

leapjs-plugins

Version:
85 lines (74 loc) 3.24 kB
//CoffeeScript generated from main/screen-position/leap.screen-position.coffee /* Adds the "screenPosition" method by default to hands and pointables. This returns a vec3 (an array of length 3) with [x,y,z] screen coordinates indicating where the hand is, originating from the bottom left. This method can accept an optional vec3, allowing it to convert any arbitrary vec3 of coordinates. Custom positioning methods can be passed in, allowing different scaling techniques, e.g., http://msdn.microsoft.com/en-us/library/windows/hardware/gg463319.aspx (Pointer Ballistics) Here we scale based upon the interaction box and screen size: options: scale, scaleX, and scaleY. They all default to 1. verticalOffset: in pixels. This number is added to the returned Y value. Defaults to 0. controller.use 'screenPosition', { method: (positionVec3)-> Arguments for Leap.vec3 are (out, a, b) [ Leap.vec3.subtract(positionVec3, positionVec3, @frame.interactionBox.center) Leap.vec3.divide(positionVec3, positionVec3, @frame.interactionBox.size) Leap.vec3.multiply(positionVec3, positionVec3, [document.body.offsetWidth, document.body.offsetHeight, 0]) ] } More info on vec3 can be found, here: http://glmatrix.net/docs/2.2.0/symbols/vec3.html */ (function() { var screenPosition; screenPosition = function(options) { var baseScale, baseVerticalOffset, position, positioningMethods; if (options == null) { options = {}; } options.positioning || (options.positioning = 'absolute'); options.scale || (options.scale = 1); options.scaleX || (options.scaleX = 1); options.scaleY || (options.scaleY = 1); options.scaleZ || (options.scaleZ = 1); options.verticalOffset || (options.verticalOffset = 0); baseScale = 6; baseVerticalOffset = -100; positioningMethods = { absolute: function(positionVec3) { return [(window.innerWidth / 2) + (positionVec3[0] * baseScale * options.scale * options.scaleX), window.innerHeight + baseVerticalOffset + options.verticalOffset - (positionVec3[1] * baseScale * options.scale * options.scaleY), positionVec3[2] * baseScale * options.scale * options.scaleZ]; } }; position = function(vec3, memoize) { var screenPositionVec3; if (memoize == null) { memoize = false; } screenPositionVec3 = typeof options.positioning === 'function' ? options.positioning.call(this, vec3) : positioningMethods[options.positioning].call(this, vec3); if (memoize) { this.screenPositionVec3 = screenPositionVec3; } return screenPositionVec3; }; return { hand: { screenPosition: function(vec3) { return position.call(this, vec3 || this.palmPosition, !vec3); } }, pointable: { screenPosition: function(vec3) { return position.call(this, vec3 || this.tipPosition, !vec3); } } }; }; if ((typeof Leap !== 'undefined') && Leap.Controller) { Leap.Controller.plugin('screenPosition', screenPosition); } else if (typeof module !== 'undefined') { module.exports.screenPosition = screenPosition; } else { throw 'leap.js not included'; } }).call(this);