MeshInfo FastFillCutEdges(List <Vector3> edges, Vector3 pos, Vector3 normal) { if (edges.Count < 3) { throw new Exception("edges point less 3!"); } for (int i = 0; i < edges.Count - 3; i++) { Vector3 t = edges[i + 1]; Vector3 temp = edges[i + 3]; for (int j = i + 2; j < edges.Count - 1; j += 2) { if ((edges[j] - t).sqrMagnitude < 1e-6) { edges[j] = edges[i + 2]; edges[i + 3] = edges[j + 1]; edges[j + 1] = temp; break; } if ((edges[j + 1] - t).sqrMagnitude < 1e-6) { edges[j + 1] = edges[i + 2]; edges[i + 3] = edges[j]; edges[j] = temp; break; } } edges.RemoveAt(i + 2); } edges.RemoveAt(edges.Count - 1); Vector4 tangent = MeshInfo.CalculateTangent(normal); MeshInfo cutEdges = new MeshInfo(); for (int i = 0; i < edges.Count; i++) { cutEdges.Add(edges[i], Vector2.zero, normal, tangent); } int count = edges.Count - 1; for (int i = 1; i < count; i++) { cutEdges.triangles.Add(0); cutEdges.triangles.Add(i); cutEdges.triangles.Add(i + 1); } cutEdges.center = MeshInfo.center; cutEdges.size = MeshInfo.size; cutEdges.MapperCube(uvRange); return(cutEdges); }
MeshInfo FillCutEdges(List <Vector3> edges, Vector3 pos, Vector3 normal) { if (edges.Count < 3) { throw new Exception("edges point less 3!"); } for (int i = 0; i < edges.Count; i++) { for (int j = i + 1; j < edges.Count; j++) { if ((edges[i] - edges[j]).sqrMagnitude < 1e-5f) { edges.RemoveAt(j); } } } Vector3 start = edges[0]; Vector3 dir = Vector3.zero; for (int i = 1; i < edges.Count; i++) { if (dir == Vector3.zero) { dir = edges[i] - start; } } dir.Normalize(); int count = edges.Count - 1; for (int i = 2; i < count; i++) { Vector3 a = edges[i] - start; float angle = Vector3.Dot(a.normalized, dir); float dis = a.sqrMagnitude; if (dis < 1e-6f) { continue; } bool change = false; for (int j = i + 1; j < edges.Count; j++) { Vector3 b = edges[j] - start; float _angle = Vector3.Dot(b.normalized, dir); float _dis = b.sqrMagnitude; bool next = _dis <= dis; next = (angle - _angle < 0.001f) && (_angle > 0.9999f ? _dis < dis : _dis >= dis); next = change ? false : next; if (_angle - angle > 0.001f || next || _dis < 1e-6f) { if (_angle - angle > 0.001f) { change = true; } angle = _angle; dis = _dis; Vector3 temp; temp = edges[i]; edges[i] = edges[j]; edges[j] = temp; } } } Vector4 tangent = MeshInfo.CalculateTangent(normal); MeshInfo cutEdges = new MeshInfo(); for (int i = 0; i < edges.Count; i++) { cutEdges.Add(edges[i], Vector2.zero, normal, tangent); } for (int i = 1; i < count; i++) { cutEdges.triangles.Add(0); cutEdges.triangles.Add(i); cutEdges.triangles.Add(i + 1); } cutEdges.center = MeshInfo.center; cutEdges.size = MeshInfo.size; cutEdges.MapperCube(uvRange); return(cutEdges); }