An error occurred while loading the file. Please try again.
Select Git revision
FillGeometry.js
-
Amanda Ghassaei authoredAmanda Ghassaei authored
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);
}
});