protected override void BuildMeshComponents() { Vector2 center = MeshHelper.GetCenter(SplinePoints); for (int i = 0; i < SplinePoints.Length; i++) { SplinePoints[i] -= center; } var points = CatmullRomSpline.GetPoints(MeshHelper.ConvertVec2ToVec3(SplinePoints), Resolution); if (MinArea.HasValue) { points = SplineSimplification.Simplify(points, MinArea.Value, true, false); } Vertices = points.ToArray(); var connections = Triangulation.TriangulationToInt3(new List <Vector2>(MeshHelper.ConvertVec3ToVec2(Vertices))); Triangles = new int[connections.Count * 3]; for (int i = 0; i < connections.Count; i++) { Triangles[i * 3 + 0] = connections[i].A; Triangles[i * 3 + 1] = connections[i].B; Triangles[i * 3 + 2] = connections[i].C; } UVs = MeshHelper.UVUnwrap(Vertices); }
protected override void BuildMeshComponents() { Vertices = new Vector3[4]; Vector2 center = MeshHelper.GetCenter(Verts); for (int i = 0; i < 4; i++) { Vertices[i] = Verts[i] - center; } double[] angles = new double[4]; double sum = 0; for (int i = 0; i < 4; i++) { angles[i] = MeshHelper.AngleBetweenPoints(Verts[i], Verts[(i + 1) % 4], Verts[(i + 2) % 4]); sum += angles[i]; } if (System.Math.Abs(360 - sum) < 1e-3) //check for clockwise order { Triangles = new int [] { 0, 1, 3, 2, 3, 1 }; } else { int index = GetMaxIndex(angles); int a = (index + 1) % 4; int b = (index + 2) % 4; int c = (index + 3) % 4; Triangles = new int[] { a, index, c, b, a, c }; } UVs = MeshHelper.UVUnwrap(Vertices); }
protected override void BuildMeshComponents() { var points = CatmullRomSpline.GetPoints(MeshHelper.ConvertVec2ToVec3(SplinePoints), Resolution); if (MinArea.HasValue) { points = SplineSimplification.Simplify(points, MinArea.Value, true, false); } Vertices = points.ToArray(); CenterShift = MeshHelper.GetCenter(Vertices); for (int i = 0; i < Vertices.Length; i++) { Vertices[i] -= CenterShift; } Triangles = new int[Vertices.Length * 3]; for (int i = 0; i < Vertices.Length; i++) { Triangles[i * 3 + 0] = 0; Triangles[i * 3 + 1] = i; Triangles[i * 3 + 2] = (i + 1) % Vertices.Length; } UVs = MeshHelper.UVUnwrap(Vertices); }
public static TriangulatedMesh Add(Vector3 position, Vector2[] points, List <Triangulation.IntTriple> connections, Material meshMat = null, bool attachRigidbody = true) { GameObject triangulatedMesh = new GameObject(); triangulatedMesh.transform.position = MeshHelper.GetCenter(points); TriangulatedMesh triComponent = triangulatedMesh.AddComponent <TriangulatedMesh>(); triComponent.Build(points, connections, meshMat); if (attachRigidbody) { triangulatedMesh.AddComponent <Rigidbody2D>(); } return(triComponent); }
protected override void BuildMeshComponents() { Vector2 center = MeshHelper.GetCenter(Vertices); Vertices = new Vector3[Points.Length]; for (int i = 0; i < Vertices.Length; i++) { Vertices[i] = Points[i] - center; } Triangles = new int[Connections.Count * 3]; for (int i = 0; i < Connections.Count; i++) { Triangles[i * 3 + 0] = Connections[i].A; Triangles[i * 3 + 1] = Connections[i].B; Triangles[i * 3 + 2] = Connections[i].C; } UVs = MeshHelper.UVUnwrap(Vertices); }
public static LineMesh AddLine(Vector3 position, Vector2[] lineVerts, float lineWidth, bool useDoubleCollider, Space space, Material meshMat = null, bool attachRigidbody = true) { GameObject line = new GameObject(); if (space == Space.Self) { line.transform.position = position; } else { line.transform.position = position + (Vector3)MeshHelper.GetCenter(lineVerts); } LineMesh lineComponent = line.AddComponent <LineMesh>(); lineComponent.Build(lineVerts, lineWidth, useDoubleCollider, meshMat); if (attachRigidbody) { line.AddComponent <Rigidbody2D>(); } return(lineComponent); }
public static SplineShapeMesh AddSplineShape(Vector3 position, Vector2[] splinePoints, float resolution = 0.2f, float?minArea = null, Space space = Space.World, Material meshMat = null, bool attachRigidbody = true) { GameObject splineShapeMesh = new GameObject(); if (space == Space.Self) { splineShapeMesh.transform.position = position; } else { splineShapeMesh.transform.position = position + (Vector3)MeshHelper.GetCenter(splinePoints); } SplineShapeMesh splineMeshComponent = splineShapeMesh.AddComponent <SplineShapeMesh>(); splineMeshComponent.Build(splinePoints, resolution, minArea, meshMat); if (attachRigidbody) { splineShapeMesh.AddComponent <Rigidbody2D>(); } return(splineMeshComponent); }
public static SplineCurveMesh AddSplineCurve(Vector3 position, Vector2[] splinePoints, float resolution, float width, bool useDoubleCollider, float?minArea, Space space, Material meshMat = null, bool attachRigidbody = true) { GameObject curve = new GameObject(); if (space == Space.Self) { curve.transform.position = position; } else { curve.transform.position = position + (Vector3)MeshHelper.GetCenter(splinePoints); } curve.transform.position = position; SplineCurveMesh curveComponent = curve.AddComponent <SplineCurveMesh>(); curveComponent.Build(splinePoints, resolution, width, useDoubleCollider, minArea, meshMat); if (attachRigidbody) { curve.AddComponent <Rigidbody2D>(); } return(curveComponent); }
protected override void BuildMeshComponents() { #region DoubleCollider if (UseDoubleCollider) { cachedVertsLeft = new List <Vector2>(); cachedVertsRight = new List <Vector2>(); } #endregion List <Vector3> verticesList = new List <Vector3>(); List <int> trianglesList = new List <int>(); Vector2 center = MeshHelper.GetCenter(LineVerts); for (int i = 0; i < LineVerts.Length; i++) { LineVerts[i] -= center; } int currentVertIndex = 0; int currentTriIndex = 0; //add first two vertices float angle = Mathf.Atan2(LineVerts[1].y - LineVerts[0].y, LineVerts[1].x - LineVerts[0].x); float oldAngle, angleDiff; Vector2 p1 = new Vector2(Mathf.Cos(angle + deg90), Mathf.Sin(angle + deg90)) * LineWidth; Vector2 p2 = new Vector2(Mathf.Cos(angle - deg90), Mathf.Sin(angle - deg90)) * LineWidth; if (p1 != p2) { verticesList.Add(LineVerts[currentVertIndex] + p1); verticesList.Add(LineVerts[currentVertIndex] + p2); #region DoubleCollider if (UseDoubleCollider) { cachedVertsLeft.Add(verticesList[verticesList.Count - 2]); cachedVertsRight.Add(verticesList[verticesList.Count - 1]); } #endregion } else { verticesList.Add(LineVerts[currentVertIndex]); #region DoubleCollider if (UseDoubleCollider) { cachedVertsLeft.Add(verticesList[verticesList.Count - 1]); cachedVertsRight.Add(verticesList[verticesList.Count - 1]); } #endregion } oldAngle = angle; currentVertIndex++; // add middle vertices for (int i = 0; i < LineVerts.Length - 2; i++, currentVertIndex++) { angle = Mathf.Atan2(LineVerts[currentVertIndex + 1].y - LineVerts[currentVertIndex].y, LineVerts[currentVertIndex + 1].x - LineVerts[currentVertIndex].x); angleDiff = oldAngle + MeshHelper.AngleDifference(oldAngle, angle) * 0.5f; p1 = new Vector2(Mathf.Cos(angleDiff + deg90), Mathf.Sin(angleDiff + deg90)) * LineWidth; p2 = new Vector2(Mathf.Cos(angleDiff - deg90), Mathf.Sin(angleDiff - deg90)) * LineWidth; if (p1 != p2) { verticesList.Add(LineVerts[currentVertIndex] + p1); verticesList.Add(LineVerts[currentVertIndex] + p2); trianglesList.Add(currentTriIndex + 0); trianglesList.Add(currentTriIndex + 3); trianglesList.Add(currentTriIndex + 1); trianglesList.Add(currentTriIndex + 3); trianglesList.Add(currentTriIndex + 0); trianglesList.Add(currentTriIndex + 2); currentTriIndex += 2; } else { verticesList.Add(LineVerts[currentTriIndex] + p1); if (verticesList[verticesList.Count - 1] != verticesList[verticesList.Count - 2]) { trianglesList.Add(currentTriIndex + 0); trianglesList.Add(currentTriIndex + 3); trianglesList.Add(currentTriIndex + 1); currentTriIndex++; } } #region DoubleCollider if (UseDoubleCollider) { cachedVertsLeft.Add(verticesList[verticesList.Count - 2]); cachedVertsRight.Add(verticesList[verticesList.Count - 1]); } #endregion oldAngle = angle; } //add last two vertices if (LineVerts[0] != LineVerts[currentVertIndex]) { angle = Mathf.Atan2(LineVerts[currentVertIndex].y - LineVerts[currentVertIndex - 1].y, LineVerts[currentVertIndex].x - LineVerts[currentVertIndex - 1].x); p1 = new Vector2(Mathf.Cos(angle + deg90), Mathf.Sin(angle + deg90)) * LineWidth; p2 = new Vector2(Mathf.Cos(angle - deg90), Mathf.Sin(angle - deg90)) * LineWidth; if (p1 != p2) { verticesList.Add(LineVerts[currentVertIndex] + p1); verticesList.Add(LineVerts[currentVertIndex] + p2); trianglesList.Add(currentTriIndex + 0); trianglesList.Add(currentTriIndex + 3); trianglesList.Add(currentTriIndex + 1); trianglesList.Add(currentTriIndex + 3); trianglesList.Add(currentTriIndex + 0); trianglesList.Add(currentTriIndex + 2); } else { //make LineMesh loop if (verticesList[verticesList.Count - 1] != verticesList[verticesList.Count - 2]) { verticesList.Add(LineVerts[currentTriIndex] + p1); trianglesList.Add(currentTriIndex + 0); trianglesList.Add(currentTriIndex + 3); trianglesList.Add(currentTriIndex + 1); } } #region DoubleCollider if (UseDoubleCollider) { cachedVertsLeft.Add(verticesList[verticesList.Count - 2]); cachedVertsRight.Add(verticesList[verticesList.Count - 1]); } #endregion } else { oldAngle = Mathf.Atan2( LineVerts[0].y - LineVerts[currentVertIndex].y, LineVerts[0].x - LineVerts[currentVertIndex].x); angle = Mathf.Atan2( LineVerts[1].y - LineVerts[0].y, LineVerts[1].x - LineVerts[0].x); angleDiff = oldAngle + MeshHelper.AngleDifference(oldAngle, angle) * 0.5f - deg90; p1 = new Vector2(Mathf.Cos(angleDiff - deg90), Mathf.Sin(angleDiff - deg90)) * LineWidth; p2 = new Vector2(Mathf.Cos(angleDiff + deg90), Mathf.Sin(angleDiff + deg90)) * LineWidth; verticesList[0] = LineVerts[currentVertIndex] + p1; verticesList[1] = LineVerts[currentVertIndex] + p2; #region DoubleCollider if (UseDoubleCollider) { cachedVertsLeft[0] = verticesList[0]; cachedVertsRight[0] = verticesList[1]; cachedVertsLeft.Add(verticesList[verticesList.Count - 2]); cachedVertsRight.Add(verticesList[verticesList.Count - 1]); } #endregion trianglesList.Add(0); trianglesList.Add(verticesList.Count - 1); trianglesList.Add(1); trianglesList.Add(verticesList.Count - 1); trianglesList.Add(0); trianglesList.Add(verticesList.Count - 2); } Vertices = verticesList.ToArray(); Triangles = trianglesList.ToArray(); UVs = MeshHelper.UVUnwrap(Vertices); }