more indexing optimizations
This commit is contained in:
parent
7baecb20ac
commit
a1c274341e
2 changed files with 33 additions and 14 deletions
|
|
@ -424,6 +424,7 @@ const tool = {
|
||||||
models = fallback(models);
|
models = fallback(models);
|
||||||
api.log.emit('mapping faces').pin();
|
api.log.emit('mapping faces').pin();
|
||||||
let promises = [];
|
let promises = [];
|
||||||
|
// let mark = Date.now();
|
||||||
for (let m of models) {
|
for (let m of models) {
|
||||||
let p = worker.model_mapFaces({ id: m.id, opt }).then(data => {
|
let p = worker.model_mapFaces({ id: m.id, opt }).then(data => {
|
||||||
// console.log({map_info: data});
|
// console.log({map_info: data});
|
||||||
|
|
@ -432,6 +433,7 @@ const tool = {
|
||||||
}
|
}
|
||||||
Promise.all(promises).then(() => {
|
Promise.all(promises).then(() => {
|
||||||
api.log.emit('mapping complete').unpin();
|
api.log.emit('mapping complete').unpin();
|
||||||
|
// api.log.emit(`... time = ${Date.now() - mark}`);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -107,7 +107,7 @@ mesh.tool = class MeshTool {
|
||||||
const _va = new Vector3();
|
const _va = new Vector3();
|
||||||
const _vb = new Vector3();
|
const _vb = new Vector3();
|
||||||
const _vc = new Vector3();
|
const _vc = new Vector3();
|
||||||
for (let i=0, l=vertices.length; i<l; ) {
|
for (let i=0, ni=0, l=vertices.length; i<l; ) {
|
||||||
_va.set(vertices[i++], vertices[i++], vertices[i++]);
|
_va.set(vertices[i++], vertices[i++], vertices[i++]);
|
||||||
_vb.set(vertices[i++], vertices[i++], vertices[i++]);
|
_vb.set(vertices[i++], vertices[i++], vertices[i++]);
|
||||||
_vc.set(vertices[i++], vertices[i++], vertices[i++]);
|
_vc.set(vertices[i++], vertices[i++], vertices[i++]);
|
||||||
|
|
@ -154,11 +154,13 @@ mesh.tool = class MeshTool {
|
||||||
const vcount = vertices.length / 3;
|
const vcount = vertices.length / 3;
|
||||||
const fcount = vcount / 3;
|
const fcount = vcount / 3;
|
||||||
const vround = vertices.map(v => (v * prec) | 0);
|
const vround = vertices.map(v => (v * prec) | 0);
|
||||||
// side records [ fcount, f1, f2 ]
|
// side records [ vi0, vi1, fn1, fn2 ]
|
||||||
const sides = new Uint32Array(fcount * 3);
|
const sides = new Uint32Array(fcount * 4);
|
||||||
|
// map of side index to face count
|
||||||
|
const srecs = {};
|
||||||
// side extended records when face count exceeds 2 (bad mesh)
|
// side extended records when face count exceeds 2 (bad mesh)
|
||||||
const sideExt = {};
|
const sideExt = {};
|
||||||
// face record array [ ni, s0, s1, s2 ]
|
// face record array [ nx, ny, nz, sn0, sn1, sn2 ]
|
||||||
const faces = new Float32Array(fcount * 6);
|
const faces = new Float32Array(fcount * 6);
|
||||||
// vertex key to vertex index
|
// vertex key to vertex index
|
||||||
const vimap = {};
|
const vimap = {};
|
||||||
|
|
@ -168,20 +170,24 @@ mesh.tool = class MeshTool {
|
||||||
const simap = {};
|
const simap = {};
|
||||||
// tmp face vertex indices
|
// tmp face vertex indices
|
||||||
const vinds = [ 0, 0, 0 ];
|
const vinds = [ 0, 0, 0 ];
|
||||||
|
// tmp face raw vertex offset
|
||||||
|
const viraw = [ 0, 0, 0 ];
|
||||||
// tmp vector array
|
// tmp vector array
|
||||||
const vects = [ new Vector3(), new Vector3(), new Vector3() ];
|
const vects = [ new Vector3(), new Vector3(), new Vector3() ];
|
||||||
// i=vround index, fi=faces record index
|
// i=vround index, fi=faces record index
|
||||||
// vi=vinds index % 3, x,y,z = tmp vars
|
// vi=vinds index % 3, x,y,z = tmp vars
|
||||||
// fn=next face index, vn=next vertex index, sn=next side index
|
// fn=next face index, vn=next vertex index, sn=next side index
|
||||||
for (let i=0, l=vround.length, fn=0, vn=0, sn=0, fi=0, vi=0, x, y, z; i<l; ) {
|
for (let i=0, l=vround.length, fn=0, vn=0, sn=0, fi=0, vi=0, x, y, z; i<l; ) {
|
||||||
|
const vroot = i;
|
||||||
// create unique vertex map
|
// create unique vertex map
|
||||||
vects[vi].set(x = vround[i++], y = vround[i++], z = vround[i++]);
|
vects[vi].set(x = vround[i++], y = vround[i++], z = vround[i++]);
|
||||||
let key = [ x, y, z ].join(',');
|
let key = x + ',' + y + ',' + z;
|
||||||
// vertex index
|
// vertex index
|
||||||
let vid = vimap[key];
|
let vid = vimap[key];
|
||||||
if (vid === undefined) {
|
if (vid === undefined) {
|
||||||
vid = vimap[key] = vn++;
|
vid = vimap[key] = vn++;
|
||||||
}
|
}
|
||||||
|
viraw[vi] = vroot;
|
||||||
vinds[vi++] = vid;
|
vinds[vi++] = vid;
|
||||||
// completed record for a face
|
// completed record for a face
|
||||||
if (vi === 3) {
|
if (vi === 3) {
|
||||||
|
|
@ -189,21 +195,31 @@ mesh.tool = class MeshTool {
|
||||||
const cfn = THREE.computeFaceNormal(...vects);
|
const cfn = THREE.computeFaceNormal(...vects);
|
||||||
const [ v0, v1, v2 ] = vinds;
|
const [ v0, v1, v2 ] = vinds;
|
||||||
// create consistent side order for index key
|
// create consistent side order for index key
|
||||||
const s0 = (v0 < v1 ? [ v0, v1 ] : [ v1, v0 ]).join(',');
|
const s0 = (v0 < v1 ? v0 + "," + v1 : v1 + "," +v0);
|
||||||
const s1 = (v1 < v2 ? [ v1, v2 ] : [ v2, v1 ]).join(',');
|
const s1 = (v1 < v2 ? v1 + "," + v2 : v2 + "," +v1);
|
||||||
const s2 = (v2 < v0 ? [ v2, v0 ] : [ v0, v2 ]).join(',');
|
const s2 = (v2 < v0 ? v2 + "," + v0 : v0 + "," +v2);
|
||||||
|
// for storing raw vertex offset in side record
|
||||||
|
const [ vr0, vr1, vr2 ] = viraw;
|
||||||
|
const vv = [ vr0, vr1, vr1, vr2, vr2, vr0 ];
|
||||||
// store face indexes into sdrec array for each side
|
// store face indexes into sdrec array for each side
|
||||||
const smap = [ s0, s1, s2 ].map(key => {
|
const smap = [ s0, s1, s2 ].map((key,ki) => {
|
||||||
let sid = simap[key];
|
let sid = simap[key], sdoff, sdcnt;
|
||||||
if (sid === undefined) {
|
if (sid === undefined) {
|
||||||
sid = simap[key] = sn++;
|
sid = simap[key] = sn++;
|
||||||
}
|
sdcnt = srecs[sid] = 1;
|
||||||
let sdoff = sid * 3;
|
sdoff = sid * 4;
|
||||||
let sdcnt = ++sides[sdoff];
|
sides[sdoff] = vv[ki * 2];
|
||||||
if (sdcnt > 2) {
|
sides[sdoff + 1] = vv[ki * 2 + 1];
|
||||||
(sideExt[sid] = sideExt[sid] || [ sides[sdoff + 1], sides[sdoff + 2] ]).push(fn);
|
|
||||||
} else {
|
} else {
|
||||||
sides[sdoff + sdcnt] = fn;
|
sdoff = sid * 4;
|
||||||
|
sdcnt = ++srecs[sid];
|
||||||
|
}
|
||||||
|
if (sdcnt > 2) {
|
||||||
|
(sideExt[sid] = sideExt[sid] ||
|
||||||
|
[ sides[sdoff], sides[sdoff + 1], sides[sdoff + 2], sides[sdoff + 3] ]
|
||||||
|
).push(fn);
|
||||||
|
} else {
|
||||||
|
sides[sdoff + sdcnt + 1] = fn;
|
||||||
}
|
}
|
||||||
return sid;
|
return sid;
|
||||||
});
|
});
|
||||||
|
|
@ -220,6 +236,7 @@ mesh.tool = class MeshTool {
|
||||||
this.indexed = {
|
this.indexed = {
|
||||||
faces, sides, sideExt
|
faces, sides, sideExt
|
||||||
};
|
};
|
||||||
|
// console.log(this.indexed);
|
||||||
}
|
}
|
||||||
|
|
||||||
getAdjacentFaces(face) {
|
getAdjacentFaces(face) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue