public static List <Vector3> Split(Vector3 from, Vector3 to, Vector3 curve, int count)
        {
            List <Vector3> segments = new List <Vector3>();

            segments.Add(from);

            if (count <= 0)
            {
                return(segments);
            }
            var handler = Bezier.CalcHandler(from, to, curve);

            for (int i = 1; i <= count; i++)
            {
                var t = (float)i / count;
                segments.Add(Bezier.Square(from, to, handler, t));
            }
            return(segments);
        }
Example #2
0
        void HandleOnUpdateCurve( )
        {
            var count = Mathf.Ceil(1 / curveDetail);

            //Build the curve
            var handler = Bezier.CalcHandler(startPosition, endPosition, curvePosition);;
            //var handler = curvePosition;// //Bezier.Control(startPosition, endPosition, curvePosition);
            var center = Bezier.Square(startPosition, endPosition, handler, 0.5F);
            //centerPosition = new Vector3 ( center.x, center.y, 0 );

            var vertices  = new List <Vector3>();
            var triangles = new List <int>();
            var uv        = new List <Vector2>();
            var normals   = new List <Vector3>();
            var tangents  = new List <Vector4>();

            float UVX = 0F;

            Vector2 I0, I1, I2, I3;

            for (int i = 0; i < count; i++)
            {
                var pre  = Bezier.Square(startPosition, endPosition, handler, (float)(i - 1) / count);
                var cur  = Bezier.Square(startPosition, endPosition, handler, (float)i / count);
                var next = Bezier.Square(startPosition, endPosition, handler, (float)(i + 1) / count);

                var preTegent    = cur - pre;
                var nextTegent   = next - cur;
                var normal       = Vector3.back;
                var preBinormal  = Vector3.zero;
                var nextBinormal = Vector3.zero;

                Vector3.OrthoNormalize(ref normal, ref preTegent, ref preBinormal);
                Vector3.OrthoNormalize(ref normal, ref nextTegent, ref nextBinormal);

                var preOffset  = width * 0.5F * preBinormal;
                var nextOffset = width * 0.5F * nextBinormal;

                var p0 = pre + preOffset;   // (Vector2)(pre + preOffset);
                var p1 = cur + preOffset;   // (Vector2) (cur + preOffset);

                var p2 = cur + nextOffset;  // (Vector2) (cur + nextOffset);
                var p3 = next + nextOffset; // (Vector2) (next + nextOffset);

                var p4 = pre - preOffset;   // (Vector2) (pre - preOffset);
                var p5 = cur - preOffset;   // (Vector2) (cur - preOffset);

                var p6 = cur - nextOffset;  // (Vector2) (cur - nextOffset);
                var p7 = next - nextOffset; // (Vector2)  (next - nextOffset);

                var preLength  = Vector3.Distance(cur, pre);
                var nextLength = Vector3.Distance(next, cur);

                int size = vertices.Count;

                if (size != 0 && CGAlgorithm.Intersect2D_2Segments(p0, p1, p2, p3, out I0, out I1) > 0)
                {
                    int interIndex = size - 2;
                    vertices [interIndex] = I0;
                    vertices.AddRange(new Vector3 [] { p6, I0, p3, p7 });

                    triangles.AddRange(new int [] { size, size + 2, size + 1, size, size + 3, size + 2, size - 1, size, interIndex });
                }
                else if (size != 0 && CGAlgorithm.Intersect2D_2Segments(p4, p5, p6, p7, out I2, out I3) > 0)
                {
                    int interIndex = size - 1;
                    vertices [interIndex] = I2;
                    vertices.AddRange(new Vector3 [] { I2, p2, p3, p7 });
                    triangles.AddRange(new int [] { size, size + 2, size + 1, size, size + 3, size + 2, interIndex, size + 1, size - 2 });
                }
                else
                {
                    vertices.AddRange(new Vector3 [] { p6, p2, p3, p7 });
                    triangles.AddRange(new int [] { size, size + 2, size + 1, size, size + 3, size + 2 });
                }

                var preUVX = UVX;
                UVX += nextLength / width;
                uv.AddRange(new Vector2 [] { new Vector2(preUVX, 0), new Vector2(preUVX, 1), new Vector2(UVX, 1), new Vector2(UVX, 0) });
                normals.AddRange(new Vector3 [] { Vector3.back, Vector3.back, Vector3.back, Vector3.back });
                tangents.AddRange(new Vector4 [] { new Vector4(-1, 0, 0, -1), new Vector4(-1, 0, 0, -1), new Vector4(-1, 0, 0, -1), new Vector4(-1, 0, 0, -1) });
            }

            Vertices  = vertices.ToArray( );
            Triangles = triangles.ToArray( );
            UV        = uv.ToArray( );
            Normals   = normals.ToArray( );
            Tangents  = tangents.ToArray( );
        }