public static MeshDraft BaselessPyramid(Vector3 baseCenter, Vector3 apex, float radius, int segments, bool inverted = false) { float segmentAngle = Mathf.PI * 2 / segments * (inverted ? -1 : 1); float currentAngle = 0f; var vertices = new Vector3[segments + 1]; vertices[0] = apex; for (var i = 1; i <= segments; i++) { vertices[i] = PTUtils.PointOnCircle3(radius, currentAngle) + baseCenter; currentAngle += segmentAngle; } var draft = new MeshDraft { name = "BaselessPyramid" }; for (var i = 1; i < segments; i++) { draft.Add(Triangle(vertices[0], vertices[i], vertices[i + 1])); } draft.Add(Triangle(vertices[0], vertices[vertices.Length - 1], vertices[1])); return(draft); }
public static MeshDraft Render(Dictionary <PointDirection, TilePoint> tilePoints, string resourceKey, Atlas atlas = null) { var draft = new MeshDraft(); draft.Add(TriDraft(PointDirection.NorthWest, PointDirection.NorthEast, PointDirection.SouthEast, tilePoints, atlas, resourceKey)); draft.Add(TriDraft(PointDirection.NorthWest, PointDirection.SouthEast, PointDirection.SouthWest, tilePoints, atlas, resourceKey)); return(draft); }
public static MeshDraft BaselessPyramid(Vector3 apex, List <Vector3> ring) { var draft = new MeshDraft { name = "BaselessPyramid" }; for (var i = 0; i < ring.Count - 1; i++) { draft.Add(Triangle(apex, ring[i], ring[i + 1])); } draft.Add(Triangle(apex, ring[ring.Count - 1], ring[0])); return(draft); }
public static MeshDraft FlatSphere(float radius, int longitudeSegments, int latitudeSegments) { float longitudeSegmentAngle = Mathf.PI * 2 / longitudeSegments; float latitudeSegmentAngle = Mathf.PI / latitudeSegments; float currentLatitude = -Mathf.PI / 2; var rings = new List <List <Vector3> >(latitudeSegments); for (var i = 0; i <= latitudeSegments; i++) { var currentLongitude = 0f; var ring = new List <Vector3>(longitudeSegments); for (int j = 0; j < longitudeSegments; j++) { ring.Add(PTUtils.PointOnSphere(radius, currentLongitude, currentLatitude)); currentLongitude -= longitudeSegmentAngle; } rings.Add(ring); currentLatitude += latitudeSegmentAngle; } var draft = new MeshDraft { name = "Flat sphere" }; for (int i = 0; i < rings.Count - 1; i++) { draft.Add(FlatBand(rings[i], rings[i + 1])); } return(draft); }
/// <summary> /// Constructs partial hexahedron aka cube with specified faces /// </summary> public static MeshDraft Hexahedron(Vector3 width, Vector3 length, Vector3 height, Directions parts) { Vector3 corner0 = -width / 2 - length / 2 - height / 2; Vector3 corner1 = width / 2 + length / 2 + height / 2; var draft = new MeshDraft { name = "Hexahedron" }; if ((parts & Directions.Left) == Directions.Left) { draft.Add(Quad(corner0, height, length)); } if ((parts & Directions.Right) == Directions.Right) { draft.Add(Quad(corner1, -length, -height)); } if ((parts & Directions.Down) == Directions.Down) { draft.Add(Quad(corner0, length, width)); } if ((parts & Directions.Up) == Directions.Up) { draft.Add(Quad(corner1, -width, -length)); } if ((parts & Directions.Back) == Directions.Back) { draft.Add(Quad(corner0, width, height)); } if ((parts & Directions.Forward) == Directions.Forward) { draft.Add(Quad(corner1, -height, -width)); } return(draft); }
public static MeshDraft FlatBand(List <Vector3> lowerRing, List <Vector3> upperRing) { var draft = new MeshDraft { name = "Flat band" }; if (lowerRing.Count < 3 || upperRing.Count < 3) { Debug.LogError("Array sizes must be greater than 2"); return(draft); } if (lowerRing.Count != upperRing.Count) { Debug.LogError("Array sizes must be equal"); return(draft); } Vector3 v0, v1, v2, v3; for (int i = 0; i < lowerRing.Count - 1; i++) { v0 = lowerRing[i]; v1 = upperRing[i]; v2 = lowerRing[i + 1]; v3 = upperRing[i + 1]; draft.Add(Triangle(v0, v1, v2)); draft.Add(Triangle(v2, v1, v3)); } v0 = lowerRing[lowerRing.Count - 1]; v1 = upperRing[upperRing.Count - 1]; v2 = lowerRing[0]; v3 = upperRing[0]; draft.Add(Triangle(v0, v1, v2)); draft.Add(Triangle(v2, v1, v3)); return(draft); }