/// <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);
        }
Exemple #3
0
        /// <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);
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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);
        }