public static Mesh GenerateBoxMesh(Settings settings, Vector3 shift) { var mesh = new MeshGenerator("Box"); var size = settings.Size * 0.5f; mesh.AddQuad( new Vector3(-size.x, +size.y, +size.z) + shift, new Vector3(+size.x, +size.y, +size.z) + shift, new Vector3(+size.x, +size.y, -size.z) + shift, new Vector3(-size.x, +size.y, -size.z) + shift, Vector3.up); mesh.AddQuad( new Vector3(+size.x, -size.y, +size.z) + shift, new Vector3(-size.x, -size.y, +size.z) + shift, new Vector3(-size.x, -size.y, -size.z) + shift, new Vector3(+size.x, -size.y, -size.z) + shift, Vector3.down); mesh.AddQuad( new Vector3(+size.x, +size.y, -size.z) + shift, new Vector3(+size.x, +size.y, +size.z) + shift, new Vector3(+size.x, -size.y, +size.z) + shift, new Vector3(+size.x, -size.y, -size.z) + shift, Vector3.right); mesh.AddQuad( new Vector3(-size.x, +size.y, +size.z) + shift, new Vector3(-size.x, +size.y, -size.z) + shift, new Vector3(-size.x, -size.y, -size.z) + shift, new Vector3(-size.x, -size.y, +size.z) + shift, Vector3.down); mesh.AddQuad( new Vector3(+size.x, -size.y, +size.z) + shift, new Vector3(+size.x, +size.y, +size.z) + shift, new Vector3(-size.x, +size.y, +size.z) + shift, new Vector3(-size.x, -size.y, +size.z) + shift, Vector3.forward); mesh.AddQuad( new Vector3(+size.x, +size.y, -size.z) + shift, new Vector3(+size.x, -size.y, -size.z) + shift, new Vector3(-size.x, -size.y, -size.z) + shift, new Vector3(-size.x, +size.y, -size.z) + shift, Vector3.back); return(mesh.Generate()); }
public static Mesh GeneratePrysmMesh(Settings settings, Vector3 shift) { var mesh = new MeshGenerator("Prysm"); int segments = settings.edgeCount; float startAngle = settings.startAngle / 180f * Mathf.PI; Vector3[] sideNormals = new Vector3[segments + 1]; Vector3[] topPoints = new Vector3[segments + 1]; Vector3[] bottomPoints = new Vector3[segments + 1]; for (int i = 0; i < topPoints.Length; i++) { float angleInRad = 2f * Mathf.PI / (float)segments * (float)i + startAngle; float angleOfNormalInRad; if (settings.smoothNormals) { angleOfNormalInRad = 2f * Mathf.PI / (float)segments * (float)(i) + startAngle; } else { angleOfNormalInRad = 2f * Mathf.PI / (float)segments * (float)(i + 0.5f) + startAngle; } topPoints[i] = new Vector3(Mathf.Sin(angleInRad), 0, Mathf.Cos(angleInRad)) * settings.radius + shift; bottomPoints[i] = topPoints[i] + new Vector3(0, -settings.depth); sideNormals[i] = new Vector3(Mathf.Sin(angleOfNormalInRad), 0, Mathf.Cos(angleOfNormalInRad)); } Vector3 topCenter = shift; Vector3 bottomCenter = shift + new Vector3(0, -settings.depth); for (int i = 0; i < segments; i++) { mesh.AddTriangle(topCenter, topPoints[i], topPoints[i + 1]); } if (settings.depth != 0) { for (int i = 0; i < segments; i++) { if (settings.smoothNormals) { mesh.AddQuad( topPoints[i + 1], topPoints[i], bottomPoints[i], bottomPoints[i + 1], sideNormals[i + 1], sideNormals[i], sideNormals[i], sideNormals[i + 1] ); } else { mesh.AddQuad( topPoints[i + 1], topPoints[i], bottomPoints[i], bottomPoints[i + 1], sideNormals[i] ); } } } for (int i = 0; i < segments; i++) { mesh.AddTriangle(bottomCenter, bottomPoints [i + 1], bottomPoints [i]); } return(mesh.Generate()); }