/// <summary> /// Constructs a quad draft /// </summary> public static MeshDraft Quad(Vector3 vertex0, Vector3 vertex1, Vector3 vertex2, Vector3 vertex3, bool generateUV = true) { var draft = new MeshDraft { name = "Quad" }; if (generateUV) { draft.AddQuad(vertex0, vertex1, vertex2, vertex3, true, new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1), new Vector2(1, 0)); } else { draft.AddQuad(vertex0, vertex1, vertex2, vertex3, true); } return(draft); }
/// <summary> /// Constructs a quad draft /// </summary> public static MeshDraft Quad(Vector3 origin, Vector3 width, Vector3 height, bool generateUV = true) { var draft = new MeshDraft { name = "Quad" }; if (generateUV) { draft.AddQuad(origin, width, height, true, new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1), new Vector2(1, 0)); } else { draft.AddQuad(origin, width, height, true); } return(draft); }
/// <summary> /// Constructs partial box with specified faces /// </summary> public static MeshDraft PartialBox(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.HasFlag(Directions.Left)) { draft.AddQuad(corner0, height, length); } if (parts.HasFlag(Directions.Right)) { draft.AddQuad(corner1, -length, -height); } if (parts.HasFlag(Directions.Down)) { draft.AddQuad(corner0, length, width); } if (parts.HasFlag(Directions.Up)) { draft.AddQuad(corner1, -width, -length); } if (parts.HasFlag(Directions.Back)) { draft.AddQuad(corner0, width, height); } if (parts.HasFlag(Directions.Forward)) { draft.AddQuad(corner1, -height, -width); } return(draft); }
/// <summary> /// Constructs a hexahedron draft /// </summary> public static MeshDraft Hexahedron(Vector3 width, Vector3 length, Vector3 height, bool generateUV = true) { Vector3 v000 = -width / 2 - length / 2 - height / 2; Vector3 v001 = v000 + height; Vector3 v010 = v000 + width; Vector3 v011 = v000 + width + height; Vector3 v100 = v000 + length; Vector3 v101 = v000 + length + height; Vector3 v110 = v000 + width + length; Vector3 v111 = v000 + width + length + height; var draft = new MeshDraft { name = "Hexahedron" }; if (generateUV) { Vector2 uv0 = new Vector2(0, 0); Vector2 uv1 = new Vector2(0, 1); Vector2 uv2 = new Vector2(1, 1); Vector2 uv3 = new Vector2(1, 0); draft.AddQuad(v100, v101, v001, v000, Vector3.left, uv0, uv1, uv2, uv3) .AddQuad(v010, v011, v111, v110, Vector3.right, uv0, uv1, uv2, uv3) .AddQuad(v010, v110, v100, v000, Vector3.down, uv0, uv1, uv2, uv3) .AddQuad(v111, v011, v001, v101, Vector3.up, uv0, uv1, uv2, uv3) .AddQuad(v000, v001, v011, v010, Vector3.back, uv0, uv1, uv2, uv3) .AddQuad(v110, v111, v101, v100, Vector3.forward, uv0, uv1, uv2, uv3); } else { draft.AddQuad(v100, v101, v001, v000, Vector3.left) .AddQuad(v010, v011, v111, v110, Vector3.right) .AddQuad(v010, v110, v100, v000, Vector3.down) .AddQuad(v111, v011, v001, v101, Vector3.up) .AddQuad(v000, v001, v011, v010, Vector3.back) .AddQuad(v110, v111, v101, v100, Vector3.forward); } return(draft); }
public static MeshDraft Quad(Vector3 vertex0, Vector3 vertex1, Vector3 vertex2, Vector3 vertex3) { var draft = new MeshDraft { name = "Quad", uv = new List <Vector2>(4) { new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1), new Vector2(1, 0) }, }; draft.AddQuad(vertex0, vertex1, vertex2, vertex3); return(draft); }
public static MeshDraft Quad(Vector3 origin, Vector3 width, Vector3 height) { var draft = new MeshDraft { name = "Quad", uv = new List <Vector2>(4) { new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1), new Vector2(1, 0) }, }; draft.AddQuad(origin, width, height); return(draft); }
/// <summary> /// Constructs a partial box with specified faces /// </summary> public static MeshDraft PartialBox(Vector3 width, Vector3 depth, Vector3 height, Directions parts, bool generateUV = true) { Vector3 v000 = -width / 2 - depth / 2 - height / 2; Vector3 v001 = v000 + height; Vector3 v010 = v000 + width; Vector3 v011 = v000 + width + height; Vector3 v100 = v000 + depth; Vector3 v101 = v000 + depth + height; Vector3 v110 = v000 + width + depth; Vector3 v111 = v000 + width + depth + height; var draft = new MeshDraft { name = "Partial box" }; if (generateUV) { Vector2 uv0 = new Vector2(0, 0); Vector2 uv1 = new Vector2(0, 1); Vector2 uv2 = new Vector2(1, 1); Vector2 uv3 = new Vector2(1, 0); if (parts.HasFlag(Directions.Left)) { draft.AddQuad(v100, v101, v001, v000, true, uv0, uv1, uv2, uv3); } if (parts.HasFlag(Directions.Right)) { draft.AddQuad(v010, v011, v111, v110, true, uv0, uv1, uv2, uv3); } if (parts.HasFlag(Directions.Down)) { draft.AddQuad(v010, v110, v100, v000, true, uv0, uv1, uv2, uv3); } if (parts.HasFlag(Directions.Up)) { draft.AddQuad(v111, v011, v001, v101, true, uv0, uv1, uv2, uv3); } if (parts.HasFlag(Directions.Back)) { draft.AddQuad(v000, v001, v011, v010, true, uv0, uv1, uv2, uv3); } if (parts.HasFlag(Directions.Forward)) { draft.AddQuad(v110, v111, v101, v100, true, uv0, uv1, uv2, uv3); } } else { if (parts.HasFlag(Directions.Left)) { draft.AddQuad(v100, v101, v001, v000, true); } if (parts.HasFlag(Directions.Right)) { draft.AddQuad(v010, v011, v111, v110, true); } if (parts.HasFlag(Directions.Down)) { draft.AddQuad(v010, v110, v100, v000, true); } if (parts.HasFlag(Directions.Up)) { draft.AddQuad(v111, v011, v001, v101, true); } if (parts.HasFlag(Directions.Back)) { draft.AddQuad(v000, v001, v011, v010, true); } if (parts.HasFlag(Directions.Forward)) { draft.AddQuad(v110, v111, v101, v100, true); } } return(draft); }
/// <summary> /// Constructs a flat revolution surface draft /// </summary> public static MeshDraft FlatRevolutionSurface( Func <float, float, float, float, Vector3> surfaceFunction, float radius, float height, int horizontalSegments, int verticalSegments, bool generateUV = true) { float horizontalSegmentAngle = 360f / horizontalSegments; float verticalSegmentAngle = 180f / verticalSegments; float currentVerticalAngle = -90; int horizontalCount = horizontalSegments + 1; var ringsVertices = new List <List <Vector3> >(verticalSegments); var ringsUV = new List <List <Vector2> >(verticalSegments); for (int y = 0; y <= verticalSegments; y++) { float currentHorizontalAngle = 0f; var ringVertices = new List <Vector3>(horizontalCount); var ringUV = new List <Vector2>(horizontalCount); for (int x = 0; x <= horizontalSegments; x++) { var point = surfaceFunction(radius, height, currentHorizontalAngle, currentVerticalAngle); ringVertices.Add(point); if (generateUV) { ringUV.Add(new Vector2(1 - (float)x / horizontalSegments, (float)y / verticalSegments)); } currentHorizontalAngle += horizontalSegmentAngle; } ringsVertices.Add(ringVertices); ringsUV.Add(ringUV); currentVerticalAngle += verticalSegmentAngle; } var draft = new MeshDraft { name = "Flat revolution surface" }; for (int y = 0; y < ringsVertices.Count - 1; y++) { var lowerRingVertices = ringsVertices[y]; var upperRingVertices = ringsVertices[y + 1]; var lowerRingUV = ringsUV[y]; var upperRingUV = ringsUV[y + 1]; for (int x = 0; x < horizontalSegments; x++) { Vector3 v00 = lowerRingVertices[x + 1]; Vector3 v01 = upperRingVertices[x + 1]; Vector3 v11 = upperRingVertices[x]; Vector3 v10 = lowerRingVertices[x]; Vector2 uv00 = lowerRingUV[x + 1]; Vector2 uv01 = upperRingUV[x + 1]; Vector2 uv11 = upperRingUV[x]; Vector2 uv10 = lowerRingUV[x]; draft.AddQuad(v00, v01, v11, v10, true, uv00, uv01, uv11, uv10); } } return(draft); }
//assume pointA and pointB is on side-face public static MeshDraft AddSkewBrige(this MeshDraft draft, Vector3 pointA, Vector3 pointB, float w, float h, bool generateUV = true) { var isHorizetal = Mathf.Abs(pointA.z - pointB.z) < 0.001f; var width = isHorizetal ? new Vector3(0, 0, w) : new Vector3(w, 0, 0); var height = new Vector3(0, h, 0); Vector3 v000, v001, v010, v011, v100, v101, v110, v111; v000 = pointA - width / 2 - height / 2; v001 = v000 + height; v010 = v000 + width; v011 = v000 + height + width; v100 = pointB - width / 2 - height / 2; v101 = v100 + height; v110 = v100 + width; v111 = v100 + height + width; if (generateUV) { Vector2 uv0 = new Vector2(0, 0); Vector2 uv1 = new Vector2(0, 1); Vector2 uv2 = new Vector2(1, 1); Vector2 uv3 = new Vector2(1, 0); if (!isHorizetal) { draft.AddQuad(v100, v101, v001, v000, Vector3.left, uv0, uv1, uv2, uv3) .AddQuad(v010, v011, v111, v110, Vector3.right, uv0, uv1, uv2, uv3) .AddQuad(v010, v110, v100, v000, Vector3.down, uv0, uv1, uv2, uv3) .AddQuad(v111, v011, v001, v101, Vector3.up, uv0, uv1, uv2, uv3) .AddQuad(v000, v001, v011, v010, Vector3.back, uv0, uv1, uv2, uv3) .AddQuad(v110, v111, v101, v100, Vector3.forward, uv0, uv1, uv2, uv3); } else { draft.AddQuad(v010, v011, v001, v000, Vector3.left, uv0, uv1, uv2, uv3) .AddQuad(v100, v101, v111, v110, Vector3.right, uv0, uv1, uv2, uv3) .AddQuad(v100, v110, v010, v000, Vector3.down, uv0, uv1, uv2, uv3) .AddQuad(v111, v101, v001, v011, Vector3.up, uv0, uv1, uv2, uv3) .AddQuad(v000, v001, v101, v100, Vector3.back, uv0, uv1, uv2, uv3) .AddQuad(v110, v111, v011, v010, Vector3.forward, uv0, uv1, uv2, uv3); } } else { if (!isHorizetal) { draft.AddQuad(v100, v101, v001, v000, Vector3.left) .AddQuad(v010, v011, v111, v110, Vector3.right) .AddQuad(v010, v110, v100, v000, Vector3.down) .AddQuad(v111, v011, v001, v101, Vector3.up) .AddQuad(v000, v001, v011, v010, Vector3.back) .AddQuad(v110, v111, v101, v100, Vector3.forward); } else { draft.AddQuad(v010, v011, v001, v000, Vector3.left) .AddQuad(v100, v101, v111, v110, Vector3.right) .AddQuad(v100, v110, v010, v000, Vector3.down) .AddQuad(v111, v101, v001, v011, Vector3.up) .AddQuad(v000, v001, v101, v100, Vector3.back) .AddQuad(v110, v111, v011, v010, Vector3.forward); } } return(draft); }