public void CombineTwoPolys() { UpdateMarkedCounts(); if (num_marked_polys == 2) { List <DPoly> polys = GetMarkedPolys(); if (DPoly.HasTwoOrMoreSharedVerts(polys[0], polys[1])) { if (Vector3.Dot(DPoly.CalculatePolyNormal(polys[0], this), DPoly.CalculatePolyNormal(polys[1], this)) > 0.8f) { // Align the UVs polys[1].UVAlignToPoly(polys[0], this); // Add verts from c_polys[1] to c_polys[0] for (int i = 0; i < polys[1].num_verts; i++) { if (!polys[0].vert.Contains(polys[1].vert[i])) { polys[0].AddVert(polys[1].vert[i], polys[1].normal[i], polys[1].tex_uv[i]); } } // Sort the verts in c_polys[0] polys[0].ReSortVerts(this); // Delete c_polys[1] polygon.Remove(polys[1]); } else { editor.AddOutputText("Polys aren't planar enough, cannot combine"); } } else { editor.AddOutputText("Polys don't share two verts, cannot combine"); } } else { editor.AddOutputText("Must mark exactly two polys to combine"); } }
public void ExtrudeSelectedPoly(float dist) { if (selected_poly > -1 && selected_poly < polygon.Count) { ClearAllMarkedPoly(); DPoly dp = polygon[selected_poly]; dp.marked = true; // EXTRUDE! Vector3 extrude_vec = DPoly.CalculatePolyNormal(dp, this) * dist; // Add extra verts and assign polygon verts int first_vert = vertex.Count; for (int i = 0; i < dp.num_verts; i++) { AddVertexEditor(vertex[dp.vert[i]] + extrude_vec); } // Create new polygons around the rim List <int> v_list = new List <int>(); for (int i = 0; i < dp.num_verts; i++) { v_list.Clear(); v_list.Add(dp.vert[i]); v_list.Add(dp.vert[(i + 1) % dp.num_verts]); v_list.Add(first_vert + (i + 1) % dp.num_verts); v_list.Add(first_vert + i); DPoly new_poly = new DPoly(v_list, dp.tex_index, this); polygon.Add(new_poly); } // Assign original polygon verts for (int i = 0; i < dp.num_verts; i++) { dp.vert[i] = first_vert + i; } } else { editor.AddOutputText("No polygon selected for extrude"); } }
public void TagCoplanarConnectedPolys(DPoly p, float angle_tol, bool recursive = false) { float angle; for (int i = 0; i < polygon.Count; i++) { if (!polygon[i].tag) { if (DPoly.HasTwoOrMoreSharedVerts(polygon[i], p)) { angle = Vector3.CalculateAngle(DPoly.CalculatePolyNormal(polygon[i], this), DPoly.CalculatePolyNormal(p, this)); if (angle <= angle_tol) { polygon[i].tag = true; if (recursive) { TagCoplanarConnectedPolys(polygon[i], angle_tol, true); } } } } } }
public void InsetExtrudeMarkedPolys(float inset_amt, float dist) { if (selected_poly > -1 && selected_poly < polygon.Count) { DPoly selected_dp = polygon[selected_poly]; if (selected_dp.marked) { // EXTRUDE! Vector3 extrude_vec = DPoly.CalculatePolyNormal(selected_dp, this) * dist; Vector3 center_vec = AverageMarkedPolyVertPosition(); // Extrude all the marked polygons TagAllPolys(false); foreach (DPoly dp in GetMarkedPolys(false)) { // Add extra verts and assign polygon verts int first_vert = vertex.Count; for (int i = 0; i < dp.num_verts; i++) { AddVertexEditor(vertex[dp.vert[i]] * (1f - inset_amt) + center_vec * inset_amt + extrude_vec); } // Create new polygons around the rim List <int> v_list = new List <int>(); for (int i = 0; i < dp.num_verts; i++) { v_list.Clear(); v_list.Add(dp.vert[i]); v_list.Add(dp.vert[(i + 1) % dp.num_verts]); v_list.Add(first_vert + (i + 1) % dp.num_verts); v_list.Add(first_vert + i); DPoly new_poly = new DPoly(v_list, dp.tex_index, this); new_poly.tag = true; polygon.Add(new_poly); } // Assign original polygon verts for (int i = 0; i < dp.num_verts; i++) { dp.vert[i] = first_vert + i; } } // Merge overlapping verts MergeOverlappingVerts(); // Remove all tagged polygons that share all verts List <DPoly> polys_to_remove = new List <DPoly>(); foreach (DPoly dp1 in polygon) { if (dp1.tag) { dp1.tag = false; foreach (DPoly dp2 in polygon) { if (dp2.tag) { if (dp1.SharesAllVerts(dp2)) { polys_to_remove.Add(dp1); polys_to_remove.Add(dp2); dp2.tag = false; } } } } } foreach (DPoly dp in polys_to_remove) { polygon.Remove(dp); } } else { editor.AddOutputText("Selected polygon must be marked for inset/bevel"); } } else { editor.AddOutputText("Must select polygon for inset/bevel"); } }