Exemple #1
0
        /// <summary>
        /// Draws a wireframe cone with position and rotation
        /// </summary>
        public static void WireCone(DebugDrawLine drawLine, Vector3 position, Quaternion rotation, float apexRadius, float angle, float length,
                                    Color color, float duration, bool depthTest)
        {
            Vector3 upperCenter = position + rotation * Vector3.up * length;
            float   upperRadius = Mathf.Tan(angle * Mathf.Deg2Rad) * length + apexRadius;

            WireCircleXZ(drawLine, upperCenter, rotation, upperRadius, color, duration, depthTest);

            Vector3 a2 = upperCenter + rotation * PTUtils.PointOnCircle3XZ(upperRadius, 0);
            Vector3 b2 = upperCenter + rotation * PTUtils.PointOnCircle3XZ(upperRadius, 90);
            Vector3 c2 = upperCenter + rotation * PTUtils.PointOnCircle3XZ(upperRadius, 180);
            Vector3 d2 = upperCenter + rotation * PTUtils.PointOnCircle3XZ(upperRadius, 270);

            if (apexRadius == 0)
            {
                drawLine(position, a2, color, duration, depthTest);
                drawLine(position, b2, color, duration, depthTest);
                drawLine(position, c2, color, duration, depthTest);
                drawLine(position, d2, color, duration, depthTest);
            }
            else
            {
                WireCircleXZ(drawLine, position, rotation, apexRadius, color, duration, depthTest);

                Vector3 a1 = position + rotation * PTUtils.PointOnCircle3XZ(apexRadius, 0);
                Vector3 b1 = position + rotation * PTUtils.PointOnCircle3XZ(apexRadius, 90);
                Vector3 c1 = position + rotation * PTUtils.PointOnCircle3XZ(apexRadius, 180);
                Vector3 d1 = position + rotation * PTUtils.PointOnCircle3XZ(apexRadius, 270);

                drawLine(a1, a2, color, duration, depthTest);
                drawLine(b1, b2, color, duration, depthTest);
                drawLine(c1, c2, color, duration, depthTest);
                drawLine(d1, d2, color, duration, depthTest);
            }
        }
Exemple #2
0
        /// <summary>
        /// Draws a wireframe cone with position and rotation
        /// </summary>
        public static void WireCone(Action <Vector3, Vector3> drawLine, Vector3 position, Quaternion rotation, float apexRadius, float angle,
                                    float length)
        {
            Vector3 baseCenter = position + rotation * Vector3.up * length;
            float   baseRadius = Mathf.Tan(angle * Mathf.Deg2Rad) * length + apexRadius;

            WireCircleXZ(drawLine, baseCenter, rotation, baseRadius);

            Vector3 a2 = baseCenter + rotation * PTUtils.PointOnCircle3XZ(baseRadius, 0);
            Vector3 b2 = baseCenter + rotation * PTUtils.PointOnCircle3XZ(baseRadius, 90);
            Vector3 c2 = baseCenter + rotation * PTUtils.PointOnCircle3XZ(baseRadius, 180);
            Vector3 d2 = baseCenter + rotation * PTUtils.PointOnCircle3XZ(baseRadius, 270);

            if (apexRadius == 0)
            {
                drawLine(position, a2);
                drawLine(position, b2);
                drawLine(position, c2);
                drawLine(position, d2);
            }
            else
            {
                WireCircleXZ(drawLine, position, rotation, apexRadius);

                Vector3 a1 = position + rotation * PTUtils.PointOnCircle3XZ(apexRadius, 0);
                Vector3 b1 = position + rotation * PTUtils.PointOnCircle3XZ(apexRadius, 90);
                Vector3 c1 = position + rotation * PTUtils.PointOnCircle3XZ(apexRadius, 180);
                Vector3 d1 = position + rotation * PTUtils.PointOnCircle3XZ(apexRadius, 270);

                drawLine(a1, a2);
                drawLine(b1, b2);
                drawLine(c1, c2);
                drawLine(d1, d2);
            }
        }
Exemple #3
0
        public static MeshDraft Cylinder(float radius, int segments, float heignt)
        {
            float segmentAngle = 360f / segments;
            float currentAngle = 0;

            var lowerRing = new List <Vector3>(segments);
            var upperRing = new List <Vector3>(segments);

            for (var i = 0; i < segments; i++)
            {
                var point = PTUtils.PointOnCircle3XZ(radius, currentAngle);
                lowerRing.Add(point - Vector3.up * heignt / 2);
                upperRing.Add(point + Vector3.up * heignt / 2);
                currentAngle -= segmentAngle;
            }

            var draft = new MeshDraft {
                name = "Cylinder"
            }
            .AddTriangleFan(lowerRing)
            .Add(Band(lowerRing, upperRing));

            upperRing.Reverse();
            draft.AddTriangleFan(upperRing);
            return(draft);
        }
Exemple #4
0
        public static MeshDraft BaselessPyramid(Vector3 baseCenter, Vector3 apex, float radius, int segments,
                                                bool inverted = false)
        {
            float segmentAngle = 360f / segments * (inverted ? -1 : 1);
            float currentAngle = 0;

            var vertices = new Vector3[segments + 1];

            vertices[0] = apex;
            for (var i = 1; i <= segments; i++)
            {
                vertices[i]   = PTUtils.PointOnCircle3XZ(radius, currentAngle) + baseCenter;
                currentAngle += segmentAngle;
            }

            var draft = new MeshDraft {
                name = "BaselessPyramid"
            };

            for (var i = 1; i < segments; i++)
            {
                draft.AddTriangle(vertices[0], vertices[i], vertices[i + 1]);
            }
            draft.AddTriangle(vertices[0], vertices[vertices.Length - 1], vertices[1]);
            return(draft);
        }
        /// <summary>
        /// Constructs a pyramid draft
        /// </summary>
        public static MeshDraft Pyramid(float radius, int segments, float height, bool generateUV = true)
        {
            float segmentAngle = 360f / segments;
            float currentAngle = 0;

            var ring = new Vector3[segments];

            for (var i = 0; i < segments; i++)
            {
                ring[i]       = PTUtils.PointOnCircle3XZ(radius, currentAngle);
                currentAngle += segmentAngle;
            }

            var draft = new MeshDraft().AddBaselessPyramid(Vector3.up * height, ring, generateUV);

            if (generateUV)
            {
                var fanUV = new Vector2[segments];
                currentAngle = 0;
                for (var i = 0; i < segments; i++)
                {
                    Vector2 uv = PTUtils.PointOnCircle2(0.5f, currentAngle) + new Vector2(0.5f, 0.5f);
                    uv.x          = 1 - uv.x;
                    fanUV[i]      = uv;
                    currentAngle += segmentAngle;
                }
                draft.AddTriangleFan(ring, Vector3.down, fanUV, true);
            }
            else
            {
                draft.AddTriangleFan(ring, Vector3.down, true);
            }
            draft.name = "Pyramid";
            return(draft);
        }
Exemple #6
0
        /// <summary>
        /// Constructs a prism draft
        /// </summary>
        public static MeshDraft Prism(float radius, int segments, float height, bool generateUV = true)
        {
            float   segmentAngle = 360f / segments;
            float   currentAngle = 0;
            Vector3 halfHeightUp = Vector3.up * height / 2;

            var lowerRing   = new List <Vector3>(segments);
            var lowerDiskUV = new List <Vector2>();
            var upperRing   = new List <Vector3>(segments);
            var upperDiskUV = new List <Vector2>();

            for (var i = 0; i < segments; i++)
            {
                var point = PTUtils.PointOnCircle3XZ(radius, currentAngle);
                lowerRing.Add(point - halfHeightUp);
                upperRing.Add(point + halfHeightUp);

                if (generateUV)
                {
                    Vector2 uv = PTUtils.PointOnCircle2(0.5f, currentAngle) + new Vector2(0.5f, 0.5f);
                    upperDiskUV.Add(uv);
                    uv.x = 1 - uv.x;
                    lowerDiskUV.Add(uv);
                }
                currentAngle += segmentAngle;
            }

            var draft = new MeshDraft {
                name = "Prism"
            }
            .AddFlatQuadBand(lowerRing, upperRing, generateUV);

            if (generateUV)
            {
                draft.AddTriangleFan(upperRing, Vector3.up, upperDiskUV)
                .AddTriangleFan(lowerRing, Vector3.down, lowerDiskUV, true);
            }
            else
            {
                draft.AddTriangleFan(upperRing, Vector3.up)
                .AddTriangleFan(lowerRing, Vector3.down, true);
            }
            return(draft);
        }
Exemple #7
0
        /// <summary>
        /// Constructs a bipyramid draft
        /// </summary>
        public static MeshDraft BiPyramid(float radius, int segments, float height, bool generateUV = true)
        {
            float segmentAngle = 360f / segments;
            float currentAngle = 0;

            var ring = new Vector3[segments];

            for (var i = 0; i < segments; i++)
            {
                ring[i]       = PTUtils.PointOnCircle3XZ(radius, currentAngle);
                currentAngle += segmentAngle;
            }

            var draft = new MeshDraft {
                name = "Bipyramid"
            }
            .AddBaselessPyramid(Vector3.up * height / 2, ring, generateUV)
            .AddBaselessPyramid(Vector3.down * height / 2, ring, generateUV, true);

            return(draft);
        }
Exemple #8
0
        private static void AddCylinderPoints(float radius, float currentAngle, Vector3 halfHeightUp, bool generateUV,
                                              ref List <Vector3> vertices, ref List <Vector2> uv, ref List <Vector3> normals,
                                              out Vector3 lowerVertex, out Vector3 upperVertex)
        {
            Vector3 normal = PTUtils.PointOnCircle3XZ(1, currentAngle);
            Vector3 point  = normal * radius;

            lowerVertex = point - halfHeightUp;
            upperVertex = point + halfHeightUp;

            vertices.Add(upperVertex);
            normals.Add(normal);
            vertices.Add(lowerVertex);
            normals.Add(normal);

            if (generateUV)
            {
                float u = 1 - currentAngle / 360;
                uv.Add(new Vector2(u, 1));
                uv.Add(new Vector2(u, 0));
            }
        }
Exemple #9
0
        public static MeshDraft Prism(float radius, int segments, float heignt)
        {
            float segmentAngle = Mathf.PI * 2 / segments;

            float currentAngle = 0f;
            var   lowerRing    = new List <Vector3>(segments);
            var   upperRing    = new List <Vector3>(segments);

            for (var i = 0; i < segments; i++)
            {
                var point = PTUtils.PointOnCircle3XZ(radius, currentAngle);
                lowerRing.Add(point - Vector3.up * heignt / 2);
                upperRing.Add(point + Vector3.up * heignt / 2);
                currentAngle -= segmentAngle;
            }

            var draft = TriangleFan(lowerRing);

            draft.Add(FlatBand(lowerRing, upperRing));
            upperRing.Reverse();
            draft.Add(TriangleFan(upperRing));
            draft.name = "Prism";
            return(draft);
        }