const THREE = require('three');
const ThreeBSP = require('./three-js-csg')(THREE);
const Glyphset = require('./primitives/glyphset').Glyphset;
/**
* Provides an object which takes in a glyphset, convert it into a CSG and further
* action such as intersect with another geometry may be performed.
*
* @class
* @author Alan Wu
* @return {GlyphsetCSG}
*/
const GlyphsetCSG = function (hostIn) {
let host = undefined;
if (hostIn && hostIn.isGlyphset)
host = hostIn;
const hostCSGs = new Array();
const currentIntersect = undefined;
this.setGlyphset = hostIn => {
if (hostIn && hostIn.isGlyphset)
host = hostIn;
hostCSG = undefined;
}
this.getGlyphset = () => {
return host;
}
const prepareCSGForGlyphs = () => {
return glyph => {
const mesh = glyph.getMesh();
const label = glyph.getLabel();
if (mesh) {
const csg = new ThreeBSP(mesh.geometry.clone().applyMatrix(mesh.matrix));
const store = [];
store.csg = csg;
store.label = label;
if (mesh.material)
store.material = mesh.material.clone();
hostCSGs.push(store);
}
};
};
const prepareCSG = guestGeometry => {
if (host && guestGeometry && guestGeometry.getMorph()) {
if (hostCSGs.length == 0) {
host.forEachGlyph(prepareCSGForGlyphs());
}
const guestCSG = new ThreeBSP(guestGeometry.getMorph());
return guestCSG;
}
return undefined;
};
this.intersect = guestGeometry => {
const guestCSG = prepareCSG(guestGeometry);
if ((hostCSGs.length > 0) && guestCSG) {
const glyphset = new (require('./primitives/glyphset').Glyphset)();
for (let i = 0; i < hostCSGs.length; i++) {
const hostCSG = hostCSGs[i];
const intersect = hostCSG.csg.intersect(guestCSG);
const mesh = intersect.toMesh();
if (mesh && mesh.geometry && (mesh.geometry.vertices.length > 0)) {
if (hostCSG.material) {
mesh.material = hostCSG.material;
mesh.material.side = THREE.DoubleSide;
mesh.material.clippingPlanes = null;
}
const glyph = glyphset.addMeshAsGlyph(mesh, i+1);
glyph.setLabel(hostCSG.label);
}
}
const newCSG = new GlyphsetCSG(glyphset);
return newCSG;
}
return undefined;
}
};
exports.GlyphsetCSG = GlyphsetCSG;