speed up true shadow

This commit is contained in:
Stewart Allen 2021-06-01 13:45:36 -04:00
commit e300978bef
3 changed files with 8 additions and 3 deletions

View file

@ -183,6 +183,7 @@
top: 0, // z top top: 0, // z top
mirror: false mirror: false
}, },
this.cache = {};
this.stats = { this.stats = {
slice_time: 0, slice_time: 0,
load_time: 0, load_time: 0,

View file

@ -1133,8 +1133,9 @@
tzindex = [ tzindex.pop() ]; tzindex = [ tzindex.pop() ];
} }
let lsz; // only shadow up to bottom of last shadow for progressive union
let terrain = slicer.slice(tzindex, { each: (data, index, total) => { let terrain = slicer.slice(tzindex, { each: (data, index, total) => {
let shadowAt = trueShadow ? CAM.shadowAt(widget, data.z) : []; let shadowAt = trueShadow ? CAM.shadowAt(widget, data.z, lsz) : [];
tshadow = POLY.union(tshadow.slice().appendAll(data.tops).appendAll(shadowAt), 0.01, true); tshadow = POLY.union(tshadow.slice().appendAll(data.tops).appendAll(shadowAt), 0.01, true);
tslices.push(data.slice); tslices.push(data.slice);
if (false) { if (false) {
@ -1159,6 +1160,7 @@
// .setLayer("lines2", {line: 0x444488, thin: true }) // .setLayer("lines2", {line: 0x444488, thin: true })
// .addLines(p2, { thin: true }); // .addLines(p2, { thin: true });
} }
lsz = data.z;
progress(index / total); progress(index / total);
}, genso: true }); }, genso: true });
@ -1175,8 +1177,9 @@
} }
CAM.shadowAt = function(widget, z, ztop) { CAM.shadowAt = function(widget, z, ztop) {
let geo = new THREE.BufferGeometry(); let geo = widget.cache.geo || new THREE.BufferGeometry()
geo.setAttribute('position', new THREE.BufferAttribute(widget.vertices, 3)); .setAttribute('position', new THREE.BufferAttribute(widget.vertices, 3));
widget.cache.geo = geo;
let rad = (Math.PI / 180); let rad = (Math.PI / 180);
let deg = (180 / Math.PI); let deg = (180 / Math.PI);
let angle = rad * 1; let angle = rad * 1;

View file

@ -121,6 +121,7 @@
}; };
let opList = [ let opList = [
// silently preface op list with OpShadow
new CAM.OPS.shadow(state, { type: "shadow" }) new CAM.OPS.shadow(state, { type: "shadow" })
]; ];