add better gyroid tile caching
This commit is contained in:
parent
4a8b925619
commit
45416b39d9
2 changed files with 25 additions and 4 deletions
|
|
@ -6,17 +6,36 @@
|
||||||
|
|
||||||
if (self.base.gyroid) return;
|
if (self.base.gyroid) return;
|
||||||
|
|
||||||
const base = self.base,
|
const base = self.base;
|
||||||
PI2 = Math.PI * 2;
|
const PI2 = Math.PI * 2;
|
||||||
|
let cache = {};
|
||||||
|
let lastVal;
|
||||||
|
let lastRes = 0;
|
||||||
|
let lastSlice = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param off {number} z offset value from 0-1
|
* @param off {number} z offset value from 0-1
|
||||||
* @param res {number} resolution (pixels/slices per side)
|
* @param res {number} resolution (pixels/slices per side)
|
||||||
*/
|
*/
|
||||||
function slice(off, res, val) {
|
function slice(off, res, val) {
|
||||||
|
// auto clear cach if it hasn't been hit in the last 20 seconds
|
||||||
|
// or the requested resolution or tip values have changed
|
||||||
|
let now = Date.now();
|
||||||
|
if (res !== lastRes || val !== lastVal || now - lastSlice > 20000) {
|
||||||
|
// console.log({clear_cache: now});
|
||||||
|
cache = {};
|
||||||
|
}
|
||||||
|
lastVal = val;
|
||||||
|
lastRes = res;
|
||||||
|
lastSlice = now;
|
||||||
let rez = parseInt(res || 200);
|
let rez = parseInt(res || 200);
|
||||||
let inc = PI2 / rez;
|
let inc = PI2 / rez;
|
||||||
let z = PI2 * off;
|
let z = PI2 * off;
|
||||||
|
let key = (z % PI2).round(3);
|
||||||
|
let hit = cache[key];
|
||||||
|
if (hit) {
|
||||||
|
return hit;
|
||||||
|
}
|
||||||
let tip = val || 0;
|
let tip = val || 0;
|
||||||
let edge = [];
|
let edge = [];
|
||||||
let vals = [];
|
let vals = [];
|
||||||
|
|
@ -146,7 +165,9 @@
|
||||||
.map(poly => filter(poly, 0))
|
.map(poly => filter(poly, 0))
|
||||||
.map(poly => filter(poly, inc));
|
.map(poly => filter(poly, inc));
|
||||||
|
|
||||||
return {edge, points, dir, polys: psimple};
|
let slice = {edge, points, dir, polys: psimple};
|
||||||
|
cache[key] = slice;
|
||||||
|
return slice;
|
||||||
}
|
}
|
||||||
|
|
||||||
// merge co-linear and distance threshold
|
// merge co-linear and distance threshold
|
||||||
|
|
|
||||||
|
|
@ -1333,7 +1333,7 @@
|
||||||
let size = process.sliceSupportSize;
|
let size = process.sliceSupportSize;
|
||||||
let s4 = size / 4;
|
let s4 = size / 4;
|
||||||
let s2 = size * 0.45;
|
let s2 = size * 0.45;
|
||||||
let min = 0.01;//process.sliceSupportArea || 1;
|
let min = 0.01;
|
||||||
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 mat = new THREE.MeshBasicMaterial();
|
let mat = new THREE.MeshBasicMaterial();
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue