ThreeUI.prototype.draw = function() {
if (!this.shouldReDraw) return;
// Reset canvas
if (this.clearRect) {
this.context.clearRect(this.clearRect.x, this.clearRect.y, this.clearRect.width, this.clearRect.height);
} else {
? ? ? ? this.context.clearRect(0, 0, this.width, this.height);
? ? ? ? this.contextMov.clearRect(0, 0, this.width, this.height);
}
var self = this;
var length = this.displayObjects.length;
for (var i = 0;i < length;i++) {
? ? ? ? if (!this.displayObjects[i].isMov)
? ? ? ? ? ? this.displayObjects[i].render(self.context);
? ? ? ? else
? ? ? ? ? ? this.displayObjects[i].render(self.contextMov);
}
? ? // Make sure the texture gets re-drawn
if (this.renderOnQuad) {
? ? ? ? this.texture.needsUpdate = true;
? ? ? ? this.textureMov.needsUpdate = true;
}
this.shouldReDraw = false;
};
clickHandler{
coords = this.windowToUISpace(coords.x, coords.y);
? ? if (this.planeMov){
? ? ? ? var coordsMov = {x:coords.x,
? ? ? ? ? ? y: coords.y + this.planeMov.position.y/DPR + (this.planeMov.geometry.parameters.height/DPR - this.height)/2 };
? ? }
var callbackQueue = [], callbackQueueMov = [];
this.eventListeners.click.forEach(function(listener) {
var displayObject = listener.displayObject;
if (!displayObject.shouldReceiveEvents()) return;
var bounds = displayObject.getBounds();
if (!displayObject.isMov && ThreeUI.isInBoundingBox(coords.x, coords.y, bounds.x, bounds.y, bounds.width, bounds.height)) {
// Put listeners in a queue first, so state changes do not impact checking other click handlers
callbackQueue.push(listener);
? ? ? ? }
? ? ? ? else if (displayObject.isMov && ThreeUI.isInBoundingBox(coordsMov.x, coordsMov.y, bounds.x, bounds.y, bounds.width, bounds.height)) {
// Put listeners in a queue first, so state changes do not impact checking other click handlers
callbackQueueMov.push(listener);
}
});
callbackQueue.forEach(function(listener){
listener.callback.bind(listener.displayObject)();
? ? });
? ? if (callbackQueue.length === 0)
? ? ? ? callbackQueueMov.forEach(function(listener){
? ? ? ? ? ? listener.callback.bind(listener.displayObject)();
? ? ? ? });
}
var scope;
var DPR = window.devicePixelRatio
ThreeUI.prototype.addPlaneMov = function() {
? ? scope = this;
? ? this.startY = 0;
? ? this.enableMov();
? ? this.setPlaneMovHeight(this.height)
}
ThreeUI.prototype.setPlaneMovHeight = function(newHeight) {
? ? this.scene.remove(this.planeMov)
var canvasMov = document.createElement('canvas');
canvasMov.width = this.width * DPR
? ? canvasMov.height = newHeight * DPR
this.contextMov = canvasMov.getContext('2d');
? ? this.contextMov.scale(DPR, DPR)
this.textureMov = new THREE.Texture(canvasMov);
var material = new THREE.MeshBasicMaterial({ map: this.textureMov });
? ? material.transparent = true;
? ? material.map.minFilter = THREE.LinearFilter;
var planeGeo = new THREE.PlaneGeometry(canvasMov.width, canvasMov.height);
? ? this.planeMov = new THREE.Mesh(planeGeo, material);
? ? this.planeMov.matrixAutoUpdate = false;
? ? this.planeMov.translateY(-0.5*(newHeight - this.height)*DPR)
? ? this.planeMov.translateZ(-1)
? ? this.planeMov.updateMatrix()
? ? this.scene.add(this.planeMov);
}
ThreeUI.prototype.enableMov = function() {
? ? window.addEventListener('mousedown', onDown);
}
ThreeUI.prototype.disableMov = function() {
? ? window.removeEventListener('mousedown', onDown);
? ? window.removeEventListener('mousemove',onMove);
? ? window.removeEventListener('mouseup',onUp);? ? ? ?
}
function onDown(e) {
? ? scope.startY = e.clientY
? ? startPosY = scope.planeMov.position.y
? ? window.addEventListener('mousemove',onMove);
? ? window.addEventListener('mouseup',onUp);
}
function onMove(e) {
? ? moveY = scope.startY - e.clientY;
? ? moveY *= DPR
? ? scope.planeMov.position.y = startPosY + moveY;? ? scope.planeMov.updateMatrix()
? ? // console.log(scope.planeMov.position)
}
function onUp(e) {
? ? moveY = scope.startY - e.clientY;
? ? var maxY = (scope.planeMov.geometry.parameters.height - scope.height*DPR)/2
? ? var minY = -maxY
? ? if (scope.planeMov.position.y < minY) {
? ? ? ? scope.planeMov.position.y = minY;? scope.planeMov.updateMatrix()
? ? } else if (scope.planeMov.position.y > maxY) {
? ? ? ? scope.planeMov.position.y = maxY;? scope.planeMov.updateMatrix()
? ? }
? ? window.removeEventListener('mousemove',onMove);
? ? window.removeEventListener('mouseup',onUp);? ?
};
DisplayObject.prototype.setMovParent = function(parent) {
? ? this.parent = parent;
? ? this.isMov = true;
? ? var bounds = this.getBounds();
? ? if (bounds.y + bounds.height > this.ui.planeMov.geometry.parameters.height/window.devicePixelRatio){
? ? ? ? this.ui.setPlaneMovHeight(bounds.y + bounds.height)
? ? }
}