Improve mesh extrude direction and side

Fix issue with plugin actions and separators in toolbars
This commit is contained in:
JannisX11 2021-11-18 21:33:54 +01:00
parent c9dd053b23
commit 9166fcdfa8
2 changed files with 57 additions and 7 deletions

View File

@ -1158,6 +1158,7 @@ class Toolbar {
let char = itemId.substr(0, 1);
content.append(`<div class="toolbar_separator ${char == '_' ? 'border' : (char == '+' ? 'spacer' : 'linebreak')}"></div>`);
this.children.push(char + guid().substr(0,8));
this.positionLookup[itemPosition] = char;
continue;
}

View File

@ -1475,14 +1475,39 @@ BARS.defineActions(function() {
let new_vertices;
let selected_faces = [];
let selected_face_keys = [];
for (let key in mesh.faces) {
let face = mesh.faces[key];
let combined_direction;
for (let fkey in mesh.faces) {
let face = mesh.faces[fkey];
if (face.isSelected()) {
selected_faces.push(face);
selected_face_keys.push(key);
selected_face_keys.push(fkey);
}
}
if (original_vertices.length >= 3 && !selected_faces.length) {
let [a, b, c] = original_vertices.slice(0, 3).map(vkey => mesh.vertices[vkey].slice());
let normal = new THREE.Vector3().fromArray(a.V3_subtract(c));
normal.cross(new THREE.Vector3().fromArray(b.V3_subtract(c))).normalize();
let face;
for (let fkey in mesh.faces) {
if (mesh.faces[fkey].vertices.filter(vkey => original_vertices.includes(vkey)).length >= 2 && mesh.faces[fkey].vertices.length > 2) {
face = mesh.faces[fkey];
break;
}
}
if (face) {
let selected_corner = mesh.vertices[face.vertices.find(vkey => original_vertices.includes(vkey))];
let opposite_corner = mesh.vertices[face.vertices.find(vkey => !original_vertices.includes(vkey))];
let face_geo_dir = opposite_corner.slice().V3_subtract(selected_corner);
if (Reusable.vec1.fromArray(face_geo_dir).angleTo(normal) < 1) {
normal.negate();
}
}
combined_direction = normal.toArray();
}
new_vertices = mesh.addVertices(...original_vertices.map(key => {
let vector = mesh.vertices[key].slice();
let direction;
@ -1503,16 +1528,26 @@ BARS.defineActions(function() {
if (!direction) {
let match;
let match_level = 0;
let match_count = 0;
for (let key in mesh.faces) {
let face = mesh.faces[key];
let matches = face.vertices.filter(vkey => original_vertices.includes(vkey));
if (match_level < matches.length) {
match_level = matches.length;
match_count = 1;
match = face;
} else if (match_level === matches.length) {
match_count++;
}
if (match_level == 3) break;
}
if (match) {
if (match_level < 3 && match_count > 2 && original_vertices.length > 2) {
// If multiple faces connect to the line, there is no point in choosing one for the normal
// Instead, construct the normal between the first 2 selected vertices
direction = combined_direction;
} else if (match) {
direction = match.getNormal(true);
}
}
@ -1559,15 +1594,30 @@ BARS.defineActions(function() {
// Create Face between extruded line
let line_vertices = remaining_vertices.slice();
let covered_edges = [];
let new_faces = [];
for (let fkey in mesh.faces) {
let face = mesh.faces[fkey];
let matched_vertices = face.vertices.filter(vkey => line_vertices.includes(new_vertices[original_vertices.indexOf(vkey)]));
let sorted_vertices = face.getSortedVertices();
let matched_vertices = sorted_vertices.filter(vkey => line_vertices.includes(new_vertices[original_vertices.indexOf(vkey)]));
if (matched_vertices.length >= 2) {
let already_handled_edge = covered_edges.find(edge => edge.includes(matched_vertices[0]) && edge.includes(matched_vertices[1]))
if (already_handled_edge) {
let handled_face = new_faces[covered_edges.indexOf(already_handled_edge)]
if (handled_face) handled_face.invert();
continue;
}
covered_edges.push(matched_vertices.slice(0, 2));
if (sorted_vertices[0] == matched_vertices[0] && sorted_vertices[1] != matched_vertices[1]) {
matched_vertices.reverse();
}
let [a, b] = matched_vertices.map(vkey => new_vertices[original_vertices.indexOf(vkey)]);
let [c, d] = matched_vertices;
let new_face = new MeshFace(mesh, face).extend({
vertices: [b, a, c, d]
vertices: [a, b, c, d]
});
new_faces.push(new_face);
mesh.addFaces(new_face);
remaining_vertices.remove(a);
remaining_vertices.remove(b);
@ -1858,7 +1908,6 @@ BARS.defineActions(function() {
if (index_difference == -1 || index_difference > 2) side_vertices.reverse();
let other_face = face.getAdjacentFace(sorted_vertices.indexOf(side_vertices[0]));
face.vertices.remove(...side_vertices);
console.log({face, side_vertices, fkey, mesh, other_face});
delete face.uv[side_vertices[0]];
delete face.uv[side_vertices[1]];
if (other_face) {