Skip to content
Snippets Groups Projects
Select Git revision
  • master default
  • dev
2 results

FillGeometry.js

Blame
  • FillGeometry.js 4.97 KiB
    /**
     * Created by aghassaei on 1/16/15.
    */
    
    
    FillGeometry = Backbone.Model.extend({
    
        defaults: {
            filename: "No File Loaded",
            mesh: null,
            boundingBox: null//show bounding box for mesh
        },
    
        initialize: function(){
    
            //bind events
        },
    
        buildNewMesh:function(geometry){
            this.removeMesh();
    
            //center geometry in x and y
            geometry.computeBoundingBox();
            geometry.applyMatrix(new THREE.Matrix4().makeTranslation(0,0,-geometry.boundingBox.min.z));//set on top of baseplane
            geometry.computeBoundingBox();
    
            var mesh = new THREE.Mesh(geometry, new THREE.MeshLambertMaterial(
                {color:0xf25536,
                    shading: THREE.FlatShading,
                    transparent:true,
                    opacity:0.4,
                    side:THREE.DoubleSide}));
            this.makeBoundingBox(mesh);
            this.set({mesh: mesh});
            globals.three.sceneAdd(mesh, null);
            globals.three.render();
        },
    
        makeBoundingBox: function(mesh){
            var box = new THREE.BoxHelper(mesh);
            box.material.color.setRGB(0,0,0);
            box.material.opacity = 0.4;
            box.material.transparent = true;
            this.set("boundingBox", box);
    //        globals.three.sceneAdd(box);
        },
    
        fillGeo: function(){
            var boundingBox = this.get("boundingBox");
            boundingBox.geometry.computeBoundingBox();
            var bounds = boundingBox.geometry.boundingBox;
    
            var scale = globals.lattice.get("scale");
    
            var minIndex = globals.lattice.getIndexForPosition(bounds.min);
            var maxIndex = globals.lattice.getIndexForPosition(bounds.max);
            globals.lattice.checkForMatrixExpansion(null, maxIndex, minIndex);//expand cells matrix before
    
            var raycaster = new THREE.Raycaster();
            var direction = new THREE.Vector3(0,0,1);
            var mesh = this.get("mesh");
            raycaster.near = 0;
            raycaster.far = bounds.max-bounds.min+2;//add some padding just in case
            for (var x=minIndex.x;x<=maxIndex.x;x++){
                for (var y=minIndex.y;y<=maxIndex.y;y++){
                    var origin = globals.lattice.getPositionForIndex({x:x, y:y, z:minIndex.z});
                    origin.z = bounds.min.z-1;//more padding
                    raycaster.set(origin, direction);
                    var intersections = raycaster.intersectObject(mesh);
                    if (intersections.length == 0) continue;
                    var inside = false;
                    var nextIntersectionIndex = 0;
                    var nextIntersection = intersections[nextIntersectionIndex].distance;
                    for (var z=minIndex.z;z<=maxIndex.z;z++){
                        var index = {x:x,y:y,z:z};
                        var position = globals.lattice.getPositionForIndex(index);
                        if (!inside){
                            if (position.z<nextIntersection) continue;
                            else {
                                inside = true;
                                globals.lattice.addCellAtIndex(index, true, true);
                            }
                        } else {
                            if (position.z<nextIntersection) {
                                globals.lattice.addCellAtIndex(index, true, true);
                                continue;
                            }
                            else inside = false;
                        }
                        var next = this._getNextIntersection(position, intersections, nextIntersectionIndex, inside);
                        if (!next) break;
                        inside = next.inside;
                        nextIntersection = next.nextIntersection;
                        nextIntersectionIndex = next.nextIntersetcionIndex;
                    }
                }
            }
            globals.three.render();
        },
    
        _getNextIntersection: function(position, intersections, nextIntersectionIndex, inside){
            nextIntersectionIndex += 1;
            if (nextIntersectionIndex < intersections.length) {
                var nextIntersection = intersections[nextIntersectionIndex].distance;
                if (nextIntersection < position.z) return this._getNextIntersection(position, intersections, nextIntersectionIndex, !inside);
                return {nextIntersection:nextIntersection, nextIntersetcionIndex: nextIntersectionIndex, inside:inside};
            }
            else return null;
        },
    
        subtractGeo: function(){
            globals.lattice.subtractMesh(this.get("mesh"));
        },
    
        removeMesh: function(){
            if (!this.get("mesh")) return;
            globals.three.sceneRemove(this.get("mesh"));
            globals.three.sceneRemove(this.get("boundingBox"));
            this.set("mesh", null);
            this.set("boundingBox", null);
            this.set("filename", this.defaults.filename);
            globals.three.render();
        },
    
        scale: function(scale){
    //        var currentScale = this.get("scale");
    //        for (var i=0;i<currentScale.length;i++){
    //            if (!scale[i]) scale[i] = currentScale[i];
    //        }
    //        this.get("mesh").scale.set(scale[0], scale[1], scale[2]);
    //        this.set("scale", scale);
        }
    });