complete proper split in z
This commit is contained in:
parent
e82501d790
commit
1958bd0c5f
4 changed files with 67 additions and 10 deletions
|
|
@ -186,6 +186,7 @@ let split = {
|
||||||
space.scene.remove(obj);
|
space.scene.remove(obj);
|
||||||
space.mouse.onHover(undefined);
|
space.mouse.onHover(undefined);
|
||||||
temp_mode = split.state = undefined;
|
temp_mode = split.state = undefined;
|
||||||
|
mesh.api.selection.update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -340,17 +340,23 @@ mesh.model = class MeshModel extends mesh.object {
|
||||||
split(plane) {
|
split(plane) {
|
||||||
// extract axes from plane and split when present (only z for now)
|
// extract axes from plane and split when present (only z for now)
|
||||||
let { z } = plane;
|
let { z } = plane;
|
||||||
|
let m4 = this.mesh.matrix;
|
||||||
return new Promise((resolve,reject) => {
|
return new Promise((resolve,reject) => {
|
||||||
let { id, matrix } = this;
|
let { id, matrix } = this;
|
||||||
worker.model_split({id, matrix, z}).then(data => {
|
worker.model_split({id, matrix, z}).then(data => {
|
||||||
let { o1, o2 } = data;
|
let { o1, o2 } = data;
|
||||||
// this becomes bottom
|
|
||||||
this.reload(o1.toFloat32());
|
|
||||||
// new model becomes top
|
// new model becomes top
|
||||||
|
if (o2.length)
|
||||||
this.group.add(new mesh.model({
|
this.group.add(new mesh.model({
|
||||||
file: `${this.file}-split`,
|
file: `${this.file}-split`,
|
||||||
mesh: o2.toFloat32()
|
mesh: o2
|
||||||
})).select();
|
}).applyMatrix4(m4)).select();
|
||||||
|
// this becomes bottom
|
||||||
|
if (o1.length) {
|
||||||
|
this.reload(o1);
|
||||||
|
} else {
|
||||||
|
this.remove();
|
||||||
|
}
|
||||||
// and we're done
|
// and we're done
|
||||||
resolve();
|
resolve();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -61,11 +61,11 @@ mesh.object = class MeshObject {
|
||||||
if (elements) {
|
if (elements) {
|
||||||
this.object.applyMatrix4(new Matrix4().fromArray(elements));
|
this.object.applyMatrix4(new Matrix4().fromArray(elements));
|
||||||
}
|
}
|
||||||
return this;
|
return this.matrixChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
applyMatrix4(matrix) {
|
applyMatrix4(matrix) {
|
||||||
return this.applyMatrix(matrix.elements).matrixChanged();
|
return this.applyMatrix(matrix.elements);
|
||||||
}
|
}
|
||||||
|
|
||||||
select() {
|
select() {
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,8 @@ function cacheUpdate(id, data) {
|
||||||
function translate_encode(id, matrix) {
|
function translate_encode(id, matrix) {
|
||||||
let rec = cache[id];
|
let rec = cache[id];
|
||||||
let geo = rec.geo.clone();
|
let geo = rec.geo.clone();
|
||||||
geo.applyMatrix4(core_matrix.clone().multiply( new Matrix4().fromArray(matrix) ));
|
let mat = core_matrix.clone().multiply(new Matrix4().fromArray(matrix));
|
||||||
|
geo.applyMatrix4(mat);
|
||||||
return geo.attributes.position.array;
|
return geo.attributes.position.array;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -87,16 +88,65 @@ let model = {
|
||||||
let o1 = [];
|
let o1 = [];
|
||||||
let o2 = [];
|
let o2 = [];
|
||||||
let pos = translate_encode(id, matrix);
|
let pos = translate_encode(id, matrix);
|
||||||
|
let split = [];
|
||||||
|
let on = [];
|
||||||
|
let over = [];
|
||||||
|
let under = [];
|
||||||
|
function sort(v) {
|
||||||
|
if (v.z < z) return under.push(v);
|
||||||
|
if (v.z > z) return over.push(v);
|
||||||
|
on.push(v);
|
||||||
|
}
|
||||||
|
function lerp(v1, v2) {
|
||||||
|
let zd = Math.abs(v1.z - v2.z);
|
||||||
|
let z1 = Math.abs(v1.z - z);
|
||||||
|
return v1.clone().lerp(v2, z1/zd);
|
||||||
|
}
|
||||||
for (let i=0, l=pos.length; i<l; ) {
|
for (let i=0, l=pos.length; i<l; ) {
|
||||||
let v1 = new Vector3(pos[i++], pos[i++], pos[i++]);
|
let v1 = new Vector3(pos[i++], pos[i++], pos[i++]);
|
||||||
let v2 = new Vector3(pos[i++], pos[i++], pos[i++]);
|
let v2 = new Vector3(pos[i++], pos[i++], pos[i++]);
|
||||||
let v3 = new Vector3(pos[i++], pos[i++], pos[i++]);
|
let v3 = new Vector3(pos[i++], pos[i++], pos[i++]);
|
||||||
if (v1.z < z && v2.z < z && v3.z < z) {
|
sort(v1);
|
||||||
o1.appendAll([...v1, ...v2, ...v3]);
|
sort(v2);
|
||||||
} else {
|
sort(v3);
|
||||||
|
let onl = on.length;
|
||||||
|
let overl = over.length;
|
||||||
|
let underl = under.length;
|
||||||
|
let isover = (overl === 3 || underl === 0);
|
||||||
|
let isunder = (underl === 3 || overl === 0);
|
||||||
|
let split = !(isover || isunder);
|
||||||
|
if (isover) {
|
||||||
o2.appendAll([...v1, ...v2, ...v3]);
|
o2.appendAll([...v1, ...v2, ...v3]);
|
||||||
}
|
}
|
||||||
|
if (isunder) {
|
||||||
|
o1.appendAll([...v1, ...v2, ...v3]);
|
||||||
}
|
}
|
||||||
|
if (split) {
|
||||||
|
if (overl === 2) {
|
||||||
|
// two over, one under
|
||||||
|
let vo = under[0] || on[0]; // under or on
|
||||||
|
let m1 = lerp(over[0], vo);
|
||||||
|
let m2 = lerp(over[1], vo);
|
||||||
|
o2.appendAll([ ...over[0], ...over[1], ...m1 ]);
|
||||||
|
o2.appendAll([ ...over[1], ...m1, ...m2 ]);
|
||||||
|
o1.appendAll([ ...m1, ...m2, ...under[0] ]);
|
||||||
|
} else {
|
||||||
|
// one over, two under
|
||||||
|
let vo = over[0] || on[0]; // over or on
|
||||||
|
let m1 = lerp(under[0], vo);
|
||||||
|
let m2 = lerp(under[1], vo);
|
||||||
|
o1.appendAll([ ...under[0], ...under[1], ...m1 ]);
|
||||||
|
o1.appendAll([ ...under[1], ...m1, ...m2 ]);
|
||||||
|
o2.appendAll([ ...m1, ...m2, ...over[0] ]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
on.length = over.length = under.length = 0;
|
||||||
|
}
|
||||||
|
let mi4 = core_matrix.clone().multiply(new Matrix4().fromArray(matrix)).invert();
|
||||||
|
let b1 = new BufferAttribute(o1.toFloat32(), 3);
|
||||||
|
let b2 = new BufferAttribute(o2.toFloat32(), 3);
|
||||||
|
o1 = b1.applyMatrix4(mi4).array;
|
||||||
|
o2 = b2.applyMatrix4(mi4).array;
|
||||||
return { o1, o2 };
|
return { o1, o2 };
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue