Skip to content
Snippets Groups Projects
Select Git revision
  • 1cc36b55ad849af1aefc94c93b36405f76cc96a7
  • master default protected
2 results

3dUI.js

Blame
  • 3dUI.js 4.45 KiB
    /**
     * Created by amandaghassaei on 5/5/17.
     */
    
    
    function init3DUI(globals) {
    
        var raycaster = new THREE.Raycaster();
        var mouse = new THREE.Vector2();
        var raycasterPlane = new THREE.Plane(new THREE.Vector3(0, 0, 1));
        var isDragging = false;
        var draggingNode = null;
        var draggingNodeFixed = false;
        var mouseDown = false;
        var highlightedObj;
    
        var highlighter1 = new Node(new THREE.Vector3());
        highlighter1.setTransparent();
        globals.threeView.scene.add(highlighter1.getObject3D());
    
        $(document).dblclick(function() {
        });
    
        document.addEventListener('mousedown', function(){
            mouseDown = true;
        }, false);
        document.addEventListener('mouseup', function(e){
            isDragging = false;
            if (draggingNode){
                draggingNode.setFixed(draggingNodeFixed);
                draggingNode = null;
                globals.fixedHasChanged = true;
                globals.threeView.enableControls(true);
                setHighlightedObj(null);
                globals.shouldCenterGeo = true;
            }
            mouseDown = false;
        }, false);
        document.addEventListener( 'mousemove', mouseMove, false );
        function mouseMove(e){
    
            if (mouseDown) {
                isDragging = true;
            }
    
            if (!globals.userInteractionEnabled) return;
    
            e.preventDefault();
            mouse.x = (e.clientX/window.innerWidth)*2-1;
            mouse.y = - (e.clientY/window.innerHeight)*2+1;
            raycaster.setFromCamera(mouse, globals.threeView.camera);
    
            var _highlightedObj = null;
            if (!isDragging) {
                _highlightedObj = checkForIntersections(e, globals.model.getMesh());
                setHighlightedObj(_highlightedObj);
            }  else if (isDragging && highlightedObj){
                if (!draggingNode) {
                    draggingNode = highlightedObj;
                    draggingNodeFixed = draggingNode.isFixed();
                    draggingNode.setFixed(true);
                    globals.fixedHasChanged = true;
                    globals.threeView.enableControls(false);
                }
                var intersection = getIntersectionWithObjectPlane(highlightedObj.getPosition().clone());
                highlightedObj.moveManually(intersection);
                globals.nodePositionHasChanged = true;
            }
    
            if (highlightedObj){
                var position = highlightedObj.getPosition();
                highlighter1.getObject3D().position.set(position.x, position.y, position.z);
            }
        }
    
        function getIntersectionWithObjectPlane(position){
            var cameraOrientation = globals.threeView.camera.getWorldDirection();
            var dist = position.dot(cameraOrientation);
            raycasterPlane.set(cameraOrientation, -dist);
            var intersection = new THREE.Vector3();
            raycaster.ray.intersectPlane(raycasterPlane, intersection);
            return intersection;
        }
    
        function setHighlightedObj(object){
            if (highlightedObj && (object != highlightedObj)) {
                highlightedObj.unhighlight();
                highlighter1.getObject3D().visible = false;
            }
            highlightedObj = object;
            if (highlightedObj) {
                highlightedObj.highlight();
                highlighter1.getObject3D().visible = true;
            }
        }
    
        function checkForIntersections(e, objects){
            var _highlightedObj = null;
            var intersections = raycaster.intersectObjects(objects, false);
            if (intersections.length>0){
                var face = intersections[0].face;
                var position = intersections[0].point;
                var verticesArray = globals.model.getVertices();
                var vertices = [];
                vertices.push(verticesArray[face.a]);
                vertices.push(verticesArray[face.b]);
                vertices.push(verticesArray[face.c]);
                var dist = vertices[0].clone().sub(position).lengthSq();
                var nodeIndex = face.a;
                for (var i=1;i<3;i++){
                    var _dist = (vertices[i].clone().sub(position)).lengthSq();
                    if (_dist<dist){
                        dist = _dist;
                        if (i==1) nodeIndex = face.b;
                        else nodeIndex = face.c;
                    }
                }
                var nodesArray = globals.model.getNodes();
                _highlightedObj = nodesArray[nodeIndex];
            }
            return _highlightedObj;
        }
    
        function hideHighlighters(){
            highlighter1.getObject3D().visible = false;
        }
        
        // globals.threeView.sceneAdd(raycasterPlane);
    
        return {
            hideHighlighters: hideHighlighters
        }
    
    }