Skip to content

Commit

Permalink
Add support to glyphsetCSG which allows each glyphs on glyphset to be…
Browse files Browse the repository at this point in the history
… cut and labled.
  • Loading branch information
alan-wu committed Mar 4, 2019
1 parent 6995ca1 commit f113184
Show file tree
Hide file tree
Showing 2 changed files with 130 additions and 34 deletions.
4 changes: 3 additions & 1 deletion src/modules/ScaffoldViewer.js
Original file line number Diff line number Diff line change
Expand Up @@ -159,8 +159,10 @@ var ScaffoldViewer = function() {
for (var i = 0; i < meshAllPartsDownloadedCallbacks.length;i++) {
meshAllPartsDownloadedCallbacks[i]();
}
if (csg)
if (csg) {
csg.allDownloadsCompletedCallback();
csg.updatePlane();
}
settingsChanged = false;
}
}
Expand Down
160 changes: 127 additions & 33 deletions src/utilities/csg.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,12 @@ exports.csg = function(sceneIn, zincRendererIn) {
var currentMaterial = undefined;
var boxGeometry = undefined;
var boxGeometry2 = undefined;
var donut = undefined;
var zincCSG = undefined;
var glyphsetCSG = undefined;
var intersect = undefined;
var currentScene = undefined;
var currentGeometry = undefined;
var currentGlyphs = undefined;
var distanceSlider = undefined;
var xRotationSlider = undefined;
var yRotationSlider = undefined;
Expand All @@ -40,9 +41,13 @@ exports.csg = function(sceneIn, zincRendererIn) {
this.reverse = false;
this.transparentMesh = false;
};
var meshCenter = undefined;
var meshRadius = undefined;
var meshDistance = undefined;
var mergedGlyphGeometry = undefined;
var meshCenter = new THREE.Vector3(0, 0, 0);
var meshRadius = 0;
var meshDistance = 0.0;
if (zincRendererIn)
zincRendererIn.getThreeJSRenderer().localClippingEnabled = true;
var originalGlyphs = undefined;

var getCentroid = function() {
if (currentGeometry) {
Expand All @@ -56,8 +61,26 @@ exports.csg = function(sceneIn, zincRendererIn) {
}
}

var mergeGlyphsCallback = function() {
return function(glyph) {
if (currentGlyphs === undefined)
currentGlyphs = new THREE.Geometry();
var mesh = glyph.getMesh();
if (mesh) {
currentGlyphs.mergeMesh(mesh);
currentGlyphs.mergeVertices();
}
}
}

var mergeGlyphset = function(zincGeometry) {
if (zincGeometry.isGlyphset) {
zincGeometry.forEachGlyph(mergeGlyphsCallback());
}
}

var mergeGeometry = function(zincGeometry) {
if (zincGeometry.groupName && zincGeometry.groupName !== "") {
if (zincGeometry.isGeometry && zincGeometry.groupName && zincGeometry.groupName !== "") {
if (currentGeometry === undefined) {
currentGeometry = zincGeometry.geometry.clone();
} else {
Expand Down Expand Up @@ -114,55 +137,125 @@ exports.csg = function(sceneIn, zincRendererIn) {
}

var createCSG = function() {
if (!zincCSG) {
var zincGeometry = csgScene.addZincGeometry(currentGeometry, 23499, 0xffffff, 1.0);
zincCSG = new Zinc.GeometryCSG(zincGeometry);
zincGeometry.setVisibility(false);
}
if (currentGeometry) {
intersect = zincCSG.intersect(boxGeometry);
intersect.morph.material.color.set(0x00ffff);
intersect.groupName = "intersect";
scene.addGeometry(intersect);
}
}
if (!zincCSG && currentGeometry) {
var zincGeometry = csgScene.addZincGeometry(currentGeometry, 23499, 0xffffff, 1.0);
zincCSG = new Zinc.GeometryCSG(zincGeometry);
zincGeometry.setVisibility(false);
}
if (!glyphsetCSG && originalGlyphs) {
glyphsetCSG = new Zinc.GlyphsetCSG(originalGlyphs);
}

if (currentGeometry) {
if (mergedGlyphGeometry === undefined && currentGlyphs) {
mergedGlyphGeometry = csgScene.addZincGeometry(currentGlyphs, 45121, 0xffffff, 1.0);
}
var intersect = undefined;
var csg1 = zincCSG.intersect(boxGeometry);
if (glyphsetCSG) {
var newGeometry = csg1.getGeometry();
intersect = glyphsetCSG.intersect(newGeometry).getGlyphset();
} else {
intersect = csg1.getGeometry();
}
if (intersect) {
if (intersect.isGeometry) {
intersect.morph.material.color.set(0xff00ff);
intersect.groupName = "intersect";
scene.addGeometry(intersect);
} else if (intersect.isGlyphset) {
console.log(intersect.getGroup());
intersect.groupName = "intersect";
scene.addGlyphset(intersect);
}
}
if (glyphsetCSG && mergedGlyphGeometry) {
var intersect2 = csg1.subtract(mergedGlyphGeometry).getGeometry();
intersect2.morph.material.color.set(0xffffff);
intersect2.groupName = "intersect";
scene.addGeometry(intersect2);
}
}
}

var removeCutFace = function(scene) {
return function(zincGeometry) {
if (zincGeometry.groupName && zincGeometry.groupName === "intersect")
scene.removeZincGeometry(zincGeometry);
return function(zincObject) {
if (zincObject.groupName && zincObject.groupName === "intersect") {
if (zincObject.isGeometry)
scene.removeZincGeometry(zincObject);
else if (zincObject.isGlyphset)
scene.removeZincGlyphset(zincObject);
}
}
}

var createCube = function(width, height, depth) {
var tempGeometry = new THREE.BoxGeometry(width, height, depth);
boxGeometry = scene.addZincGeometry(tempGeometry, 40001, 0xdddddd, 0.5, false, false, true);
boxGeometry = scene.addZincGeometry(tempGeometry, 40001, 0xdddddd, 1.0, false, false, true);
if (boxGeometry2 === undefined)
boxGeometry2 = csgScene.addZincGeometry(tempGeometry, 40001, 0xdddddd, 0.5, false, false, true);
boxGeometry2 = csgScene.addZincGeometry(tempGeometry, 40001, 0xdddddd, 1.0, false, false, true);
boxGeometry.morph.matrixAutoUpdate = false;
boxGeometry.morph.visible = false;
if (plane === undefined) {
plane = new THREE.Plane(new THREE.Vector3(0, 0, -1), 0);
planeHelper = new THREE.PlaneHelper(plane, 2, 0xff0000);
planeHelper = new THREE.PlaneHelper(plane, 1, 0xff0000);
scene.addObject(planeHelper);
}
}

var setClippingForGlyphs = function() {
return function(glyph) {
var mesh = glyph.getMesh();
if (mesh.material) {
mesh.material.clippingPlanes = [ plane ];
}
}
}

this.addOrganPartCallback = function(zincGeometry) {
mergeGeometry(zincGeometry);
zincGeometry.morph.material.clippingPlanes = [ plane ];
zincGeometry.morph.material.transparent = false;
if (zincGeometry.isGlyphset) {
originalGlyphs = zincGeometry;
mergeGlyphset(zincGeometry);
zincGeometry.forEachGlyph(setClippingForGlyphs());
} else if (zincGeometry.isGeometry && zincGeometry.morph &&
zincGeometry.morph.material) {
mergeGeometry(zincGeometry);
zincGeometry.morph.material.clippingPlanes = [ plane ];
zincGeometry.morph.visible = true;
zincGeometry.morph.transparent = false;
}
}

this.reset = function() {
csgScene.clearAll();
zincCSG = undefined;
boxGeometry = undefined;
boxGeometry2 = undefined;
currentGeometry = undefined;
createCube(5, 5, 0.001);
this.allDownloadsCompletedCallback = function() {
getCentroid();
if (meshRadius > 0) {
var dimension = meshRadius * 2.0 *1.1 + meshCenter.length();
if (boxGeometry && boxGeometry.geometry) {
boxGeometry.geometry.scale(dimension, dimension, 1.0);
}
if (boxGeometry2 && boxGeometry2.geometry) {
boxGeometry2.geometry.scale(dimension, dimension, 1.0);
}
if (planeHelper) {
planeHelper.geometry.scale(dimension, dimension, 1.0);
}
if (distanceSlider) {
distanceSlider.__min = -Math.ceil(meshRadius);
distanceSlider.__max = Math.ceil(meshRadius);
distanceSlider.updateDisplay();
}
}
}

this.reset = function() {
csgScene.clearAll();
zincCSG = undefined;
boxGeometry = undefined;
boxGeometry2 = undefined;
currentGeometry = undefined;
createCube(1, 1, 0.0005);
}

this.updatePlane = function() {
updatePlane();
}
Expand All @@ -176,6 +269,7 @@ exports.csg = function(sceneIn, zincRendererIn) {
};
controls["remove cuts"] = function() {
scene.forEachGeometry(removeCutFace(scene));
scene.forEachGlyphset(removeCutFace(scene));
};
datGui.add(controls, "remove cuts");
distanceSlider = datGui.add(guiControls, 'distance', -1.0, 1.0).step(0.01).onChange(distanceSliderChanged());
Expand Down

0 comments on commit f113184

Please sign in to comment.