true shadow improvements
This commit is contained in:
parent
2147af0cd1
commit
3f1126c7b2
2 changed files with 64 additions and 24 deletions
|
|
@ -837,6 +837,9 @@
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Slicer.checkOverUnderOn = checkOverUnderOn;
|
||||||
|
Slicer.intersectPoints = intersectPoints;
|
||||||
|
|
||||||
self.kiri.slicer2 = Slicer;
|
self.kiri.slicer2 = Slicer;
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|
|
||||||
|
|
@ -196,7 +196,7 @@
|
||||||
// exclude flats injected to complete shadow
|
// exclude flats injected to complete shadow
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
data.shadow = shadow.clone(true);
|
data.shadow = trueShadow ? CAM.shadowAt(widget, data.z) : shadow.clone(true);
|
||||||
data.slice.shadow = data.shadow;
|
data.slice.shadow = data.shadow;
|
||||||
// data.slice.tops[0].inner = data.shadow;
|
// data.slice.tops[0].inner = data.shadow;
|
||||||
// data.slice.tops[0].inner = POLY.setZ(tshadow.clone(true), data.z);
|
// data.slice.tops[0].inner = POLY.setZ(tshadow.clone(true), data.z);
|
||||||
|
|
@ -420,6 +420,7 @@
|
||||||
let shadow = [];
|
let shadow = [];
|
||||||
let slices = [];
|
let slices = [];
|
||||||
let indices = slicer.interval(op.down, { down: true, min: zBottom, fit: true, off: 0.01 });
|
let indices = slicer.interval(op.down, { down: true, min: zBottom, fit: true, off: 0.01 });
|
||||||
|
let trueShadow = process.camTrueShadow === true;
|
||||||
// shift out first (top-most) slice
|
// shift out first (top-most) slice
|
||||||
indices.shift();
|
indices.shift();
|
||||||
// add flats to shadow
|
// add flats to shadow
|
||||||
|
|
@ -446,7 +447,7 @@
|
||||||
// exclude flats injected to complete shadow
|
// exclude flats injected to complete shadow
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
data.shadow = shadow.clone(true);
|
data.shadow = trueShadow ? CAM.shadowAt(widget, data.z) : shadow.clone(true);
|
||||||
data.slice.shadow = data.shadow;
|
data.slice.shadow = data.shadow;
|
||||||
// data.slice.tops[0].inner = data.shadow;
|
// data.slice.tops[0].inner = data.shadow;
|
||||||
// data.slice.tops[0].inner = POLY.setZ(tshadow.clone(true), data.z);
|
// data.slice.tops[0].inner = POLY.setZ(tshadow.clone(true), data.z);
|
||||||
|
|
@ -911,7 +912,7 @@
|
||||||
|
|
||||||
prepare(ops, progress) {
|
prepare(ops, progress) {
|
||||||
let { op, state } = this;
|
let { op, state } = this;
|
||||||
let { settings, widget, sliceAll, tslices, updateToolDiams } = state;
|
let { settings, widget, sliceAll, updateToolDiams } = state;
|
||||||
let { setTool, setSpindle, setDrill, emitDrills } = ops;
|
let { setTool, setSpindle, setDrill, emitDrills } = ops;
|
||||||
|
|
||||||
setTool(op.tool, undefined, op.rate);
|
setTool(op.tool, undefined, op.rate);
|
||||||
|
|
@ -928,7 +929,7 @@
|
||||||
|
|
||||||
slice(progress) {
|
slice(progress) {
|
||||||
let { op, state } = this;
|
let { op, state } = this;
|
||||||
let { settings, widget, bounds, sliceAll, tslices, zMax, zThru } = state;
|
let { settings, widget, bounds, sliceAll, zMax, zThru } = state;
|
||||||
let { updateToolDiams } = state;
|
let { updateToolDiams } = state;
|
||||||
|
|
||||||
let tool = new CAM.Tool(settings, op.tool);
|
let tool = new CAM.Tool(settings, op.tool);
|
||||||
|
|
@ -1056,7 +1057,7 @@
|
||||||
|
|
||||||
prepare(ops, progress) {
|
prepare(ops, progress) {
|
||||||
let { op, state } = this;
|
let { op, state } = this;
|
||||||
let { settings, widget, sliceAll, tslices, updateToolDiams } = state;
|
let { settings, widget, sliceAll, updateToolDiams } = state;
|
||||||
let { setTool, setSpindle, setDrill, emitDrills } = ops;
|
let { setTool, setSpindle, setDrill, emitDrills } = ops;
|
||||||
|
|
||||||
if (op.axis === '-') {
|
if (op.axis === '-') {
|
||||||
|
|
@ -1118,7 +1119,7 @@
|
||||||
let trueShadow = state.settings.process.camTrueShadow === true;
|
let trueShadow = state.settings.process.camTrueShadow === true;
|
||||||
|
|
||||||
let minStepDown = real
|
let minStepDown = real
|
||||||
.map(op => (op.down || 3) / 3)
|
.map(op => (op.down || 3) / (trueShadow ? 1 : 3))
|
||||||
.reduce((a,v) => Math.min(a, v, 1));
|
.reduce((a,v) => Math.min(a, v, 1));
|
||||||
|
|
||||||
let tslices = [];
|
let tslices = [];
|
||||||
|
|
@ -1133,14 +1134,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
let terrain = slicer.slice(tzindex, { each: (data, index, total) => {
|
let terrain = slicer.slice(tzindex, { each: (data, index, total) => {
|
||||||
let downfaces = trueShadow ? CAM.angledFaces(widget, data.z).map(a => {
|
let shadowAt = trueShadow ? CAM.shadowAt(widget, data.z) : [];
|
||||||
return newPolygon()
|
tshadow = POLY.union(tshadow.slice().appendAll(data.tops).appendAll(shadowAt), 0.01, true);
|
||||||
.add(a[0].x,a[0].y,a[0].z)
|
|
||||||
.add(a[1].x,a[1].y,a[1].z)
|
|
||||||
.add(a[2].x,a[2].y,a[2].z);
|
|
||||||
}) : [];
|
|
||||||
let downunion = POLY.union(downfaces, 0.0001, true);
|
|
||||||
tshadow = POLY.union(tshadow.slice().appendAll(data.tops).appendAll(downunion), 0.01, true);
|
|
||||||
tslices.push(data.slice);
|
tslices.push(data.slice);
|
||||||
if (false) {
|
if (false) {
|
||||||
const slice = data.slice;
|
const slice = data.slice;
|
||||||
|
|
@ -1148,9 +1143,9 @@
|
||||||
slice.output()
|
slice.output()
|
||||||
.setLayer("shadow", {line: 0x888800, thin: true })
|
.setLayer("shadow", {line: 0x888800, thin: true })
|
||||||
.addPolys(POLY.setZ(tshadow.clone(true), data.z), { thin: true });
|
.addPolys(POLY.setZ(tshadow.clone(true), data.z), { thin: true });
|
||||||
// slice.output()
|
slice.output()
|
||||||
// .setLayer("slice", {line: 0x886622, thin: true })
|
.setLayer("slice", {line: 0x886622, thin: true })
|
||||||
// .addPolys(POLY.setZ(data.tops.clone(true), data.z), { thin: true });
|
.addPolys(POLY.setZ(data.tops.clone(true), data.z), { thin: true });
|
||||||
// let p1 = [], p2 = [], cp = p1;
|
// let p1 = [], p2 = [], cp = p1;
|
||||||
// for (let line of data.lines) {
|
// for (let line of data.lines) {
|
||||||
// cp.push(line.p1);
|
// cp.push(line.p1);
|
||||||
|
|
@ -1179,7 +1174,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CAM.angledFaces = function(widget, z) {
|
CAM.shadowAt = function(widget, z, ztop) {
|
||||||
let geo = new THREE.BufferGeometry();
|
let geo = new THREE.BufferGeometry();
|
||||||
geo.setAttribute('position', new THREE.BufferAttribute(widget.vertices, 3));
|
geo.setAttribute('position', new THREE.BufferAttribute(widget.vertices, 3));
|
||||||
let rad = (Math.PI / 180);
|
let rad = (Math.PI / 180);
|
||||||
|
|
@ -1194,18 +1189,60 @@
|
||||||
let a = new THREE.Vector3(array[ip++], array[ip++], array[ip++]);
|
let a = new THREE.Vector3(array[ip++], array[ip++], array[ip++]);
|
||||||
let b = new THREE.Vector3(array[ip++], array[ip++], array[ip++]);
|
let b = new THREE.Vector3(array[ip++], array[ip++], array[ip++]);
|
||||||
let c = new THREE.Vector3(array[ip++], array[ip++], array[ip++]);
|
let c = new THREE.Vector3(array[ip++], array[ip++], array[ip++]);
|
||||||
// skip faces below threshold
|
let where = undefined;
|
||||||
if (a.z < z || b.z < z || c.z < z) {
|
if (ztop && a.z > ztop && b.z > ztop && c.z > ztop) {
|
||||||
|
// skip faces over top threshold
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
let norm = THREE.computeFaceNormal(a,b,c);
|
if (a.z < z && b.z < z && c.z < z) {
|
||||||
// limit to downward faces
|
// skip faces under threshold
|
||||||
if (norm.z > thresh) {
|
continue;
|
||||||
|
} else if (a.z > z && b.z > z && c.z > z) {
|
||||||
|
// limit to selected faces over threshold
|
||||||
|
let norm = THREE.computeFaceNormal(a,b,c);
|
||||||
|
if (norm.z < thresh) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
found.push([a,b,c]);
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
// check faces straddling threshold
|
||||||
|
where = {under: [], over: [], on: []};
|
||||||
|
}
|
||||||
|
if (where) {
|
||||||
|
let { checkOverUnderOn, intersectPoints } = self.kiri.slicer2;
|
||||||
|
checkOverUnderOn(newPoint(a.x, a.y, a.z), z, where);
|
||||||
|
checkOverUnderOn(newPoint(b.x, b.y, b.z), z, where);
|
||||||
|
checkOverUnderOn(newPoint(c.x, c.y, c.z), z, where);
|
||||||
|
if (where.on.length === 0 && (where.over.length === 2 || where.under.length === 2)) {
|
||||||
|
// compute two point intersections and construct line
|
||||||
|
let line = intersectPoints(where.over, where.under, z);
|
||||||
|
if (line.length === 2) {
|
||||||
|
if (where.over.length === 2) {
|
||||||
|
found.push([where.over[0], line[0], line[1]]);
|
||||||
|
found.push([where.over[1], line[0], line[1]]);
|
||||||
|
found.push([where.over[0], where.over[1], line[1]]);
|
||||||
|
found.push([where.over[0], where.over[1], line[0]]);
|
||||||
|
} else {
|
||||||
|
found.push([where.over[0], line[0], line[1]]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log({msg: "invalid ips", line: line, where: where});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
found.push([a,b,c]);
|
found.push([a,b,c]);
|
||||||
}
|
}
|
||||||
return found;
|
let polys = found.map(a => {
|
||||||
|
return newPolygon()
|
||||||
|
.add(a[0].x,a[0].y,a[0].z)
|
||||||
|
.add(a[1].x,a[1].y,a[1].z)
|
||||||
|
.add(a[2].x,a[2].y,a[2].z);
|
||||||
|
});
|
||||||
|
return POLY.union(polys, 0.0001, true);
|
||||||
};
|
};
|
||||||
|
|
||||||
CAM.OPS = CamOp.MAP = {
|
CAM.OPS = CamOp.MAP = {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue