Skip to content
This repository has been archived by the owner on May 12, 2018. It is now read-only.

Commit

Permalink
PickingControl
Browse files Browse the repository at this point in the history
  • Loading branch information
xeolabs committed Nov 6, 2017
1 parent 2c6c046 commit cf19df6
Showing 1 changed file with 148 additions and 0 deletions.
148 changes: 148 additions & 0 deletions js/pickingControl.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
/**
Mouse picking control.
@param viewer
@param cfg
@constructor
*/
xeometry.PickingControl = function (viewer, cfg) {

var self = this;

cfg = cfg || {};

var overlay = viewer.getOverlay();

overlay.oncontextmenu = function (e) {
e.preventDefault();
};

var mousePos = [0, 0];
var needPick = false;
var pickedObjectId;

function pick() {
if (!needPick) {
return;
}
var hit = viewer.pickObject(mousePos);
if (hit) {
if (pickedObjectId !== hit.id) {
if (pickedObjectId !== undefined) {
self.fire("hoverout", pickedObjectId);
}
self.fire("hover", hit.id);
pickedObjectId = hit.id;
}
} else {
if (pickedObjectId !== undefined) {
self.fire("hoverout", pickedObjectId);
pickedObjectId = undefined;
}
}
needPick = false;
}

var tick = function () {
pick();
requestAnimationFrame(tick);
};

tick();

overlay.addEventListener("mousemove", function (e) {
getCoordsWithinElement(e, mousePos);
needPick = true;
});

overlay.addEventListener('click', (function (e) {
var clicks = 0;
var timeout;
return function (e) {
if (!eventSubs["doubleclicked"] && !eventSubs["nothingdoubleclicked"]) {
// Avoid the single/double click differentiation timeout
pick();
if (pickedObjectId) {
self.fire("clicked", pickedObjectId);
} else {
self.fire("nothingclicked");
}
return;
}
clicks++;
if (clicks == 1) {
timeout = setTimeout(function () {
pick();
if (pickedObjectId) {
self.fire("clicked", pickedObjectId);
} else {
self.fire("nothingclicked");
}
clicks = 0;
}, 250);
} else {
clearTimeout(timeout);
pick();
if (pickedObjectId) {
self.fire("doubleclicked", pickedObjectId);
} else {
self.fire("nothingdoubleclicked");
}
clicks = 0;
}
};
})(), false);

function getCoordsWithinElement(event, coords) {
if (!event) {
event = window.event;
coords[0] = event.x;
coords[1] = event.y;
}
else {
var element = event.target;
var totalOffsetLeft = 0;
var totalOffsetTop = 0;

while (element.offsetParent) {
totalOffsetLeft += element.offsetLeft;
totalOffsetTop += element.offsetTop;
element = element.offsetParent;
}
coords[0] = event.pageX - totalOffsetLeft;
coords[1] = event.pageY - totalOffsetTop;
}
}

var eventSubs = {};

/**
* Subscribes to an event on this BIMPickingControl.
* @method on
* @param {String} event The event
* @param {Function} callback Called fired on the event
*/
this.on = function (event, callback) {
var subs = eventSubs[event];
if (!subs) {
subs = [];
eventSubs[event] = subs;
}
subs.push(callback);
};

/**
* Fires an event on this BIMPickingControl.
* @method fire
* @param {String} event The event type name
* @param {Object} value The event parameters
*/
this.fire = function (event, value) {
var subs = eventSubs[event];
if (subs) {
for (var i = 0, len = subs.length; i < len; i++) {
subs[i](value);
}
}
};
};

0 comments on commit cf19df6

Please sign in to comment.