code: function DragController(camera, element, controls) {
    this.camera = camera;
    this.element = element || window;
    this.controls = controls;
  
    this.pointerUDC = new THREE.Vector2();
    this.plane = new THREE.Plane();
    this.intersection = new THREE.Vector3();
    this.offset = new THREE.Vector3();
    this.raycaster = new THREE.Raycaster();
    this.objects = [];
  
    this.dragObject = null;
    this.hoverObject = null;
  
    // MOUSE
    this.element.addEventListener('mousedown', function(e) {
      e.preventDefault();
      this.updatePointerUDC(e.clientX, e.clientY);
      this.handlePointerDown();
    }.bind(this));
  
    this.element.addEventListener('mousemove', function(e) {
      e.preventDefault();
      this.updatePointerUDC(e.clientX, e.clientY);
      this.handlePointerMove();
    }.bind(this));
  
    this.element.addEventListener('mouseup', function(e) {
      e.preventDefault();
      this.handlePointerUp();
    }.bind(this));
  
    // FINGER todo touchmove doesn't want to work :(
    // this.element.addEventListener('touchstart', function(e) {
    //   e.preventDefault();
    //   this.updatePointerUDC(e.touches[0].clientX, e.touches[0].clientY);
    //   this.handlePointerDown();
    // }.bind(this));
    //
    // this.element.addEventListener('touchmove', function(e) {
    //   e.preventDefault();
    //   this.updatePointerUDC(e.touches[0].clientX, e.touches[0].clientY);
    //   this.handlePointerMove();
    // }.bind(this));
    //
    // this.element.addEventListener('touchend', function(e) {
    //   e.preventDefault();
    //   this.handlePointerUp();
    // }.bind(this));
  }
docs: ////////////////// CLASSES //////////////////