Permalink
Cannot retrieve contributors at this time
Fetching contributors…
| // namespace | |
| var SLAcer = SLAcer || {}; | |
| ;(function() { | |
| // global settings | |
| var globalSettings = { | |
| view : 'default', | |
| target : null, | |
| controls: null, | |
| camera : null, | |
| margin : 10 | |
| }; | |
| // Constructor | |
| function ViewControls(settings) { | |
| var settings = _.defaults(settings || {}, ViewControls.globalSettings); | |
| this.view = null; | |
| this.defaultView = settings.view; | |
| this.controls = settings.controls; | |
| this.target = settings.target; | |
| this.camera = settings.camera; | |
| this.margin = settings.margin; | |
| this.focusPoint = new THREE.Object3D(); | |
| this.update(); | |
| }; | |
| // methods | |
| ViewControls.prototype.update = function() { | |
| this.target.geometry.computeBoundingBox(); | |
| this.setFocusAtCenter(); | |
| }; | |
| ViewControls.prototype.setFocusAt = function(point) { | |
| _.assign(this.focusPoint.position, point || {}); | |
| }; | |
| ViewControls.prototype.setFocusAtCenter = function() { | |
| var size = this.target.geometry.boundingBox.size(); | |
| this.setFocusAt({ x: 0, y: 0, z: 0 }); | |
| }; | |
| ViewControls.prototype.getVisibleDistance = function(width, height) { | |
| var margin = this.margin * 2; | |
| var size = height + margin; | |
| var aspect = width / height; | |
| // landscape or portrait orientation | |
| if (this.camera.aspect < aspect) { | |
| size = (width + margin) / this.camera.aspect; | |
| } | |
| return size / 2 / Math.tan(Math.PI * this.camera.fov / 360); | |
| }; | |
| ViewControls.prototype.lookAtFocusPoint = function() { | |
| // set camera target to center of build volume | |
| this.controls.target = this.focusPoint.position.clone(); | |
| this.controls.target0 = this.controls.target.clone(); | |
| // update controls | |
| this.controls.update(); | |
| }; | |
| ViewControls.prototype.set = function(view) { | |
| // reset camera position | |
| this.controls.reset(); | |
| // set new position | |
| var x = 0; | |
| var y = 0; | |
| var z = 0; | |
| var w, h; | |
| var size = this.target.geometry.boundingBox.size(); | |
| var view = view || this.defaultView; | |
| this.view = view; | |
| if (view == 'default' || view == 'front') { | |
| y = -size.y / 2; | |
| w = size.x; | |
| h = size.z; | |
| } | |
| else if (view == 'right') { | |
| x = size.x / 2; | |
| w = size.y; | |
| h = size.z; | |
| } | |
| else if (view == 'back') { | |
| y = size.y / 2; | |
| w = size.x; | |
| h = size.z; | |
| } | |
| else if (view == 'left') { | |
| x = -size.x / 2; | |
| w = size.y; | |
| h = size.z; | |
| } | |
| else if (view == 'top') { | |
| z = size.z / 2; | |
| w = size.x; | |
| h = size.y; | |
| } | |
| else if (view == 'bottom') { | |
| z = -size.z / 2; | |
| w = size.x; | |
| h = size.y; | |
| } | |
| // ensure the build volume is visible | |
| var distance = this.getVisibleDistance(w, h); | |
| if (view == 'default' || view == 'front') { | |
| y = y - distance; | |
| } | |
| else if (view == 'right') { | |
| x = x + distance; | |
| } | |
| else if (view == 'back') { | |
| y = y + distance; | |
| } | |
| else if (view == 'left') { | |
| x = x - distance; | |
| } | |
| else if (view == 'top') { | |
| z = z + distance; | |
| } | |
| else if (view == 'bottom') { | |
| z = z - distance; | |
| } | |
| // set default view | |
| if (view == 'default') { | |
| z = size.z / 2; | |
| x = size.x / 2; | |
| } | |
| // set new camera position | |
| this.camera.position.set(x, y, z); | |
| // set the camera look at focus point | |
| this.lookAtFocusPoint(); | |
| }; | |
| // global settings | |
| ViewControls.globalSettings = globalSettings; | |
| // export module | |
| SLAcer.ViewControls = ViewControls; | |
| })(); |