/**
         * <summary>
         * Splits a road by the heightmap grid, allowing perfect fitting
         * </summary>
         */
        public void GridSplit(bool debug)
        {
            foreach (Road r in Roads)
            {
                List <Node> NewNodes = new List <Node>();
                for (int i = 0; i < r.nodes.Count - 1; i++)
                {
                    Node    n1 = r.nodes[i];
                    Node    n2 = r.nodes[i + 1];
                    Vector3 vi;
                    // out i1, v1s+n1, dir1, v2s + n2, dir2
                    NewNodes.Add(n1);
                    for (float j = 0; j < 256; j++)
                    {
                        Vector3 l1  = new Vector3(j * 10, 0, 0);
                        Vector3 l2  = new Vector3(j * 10, 0, 5000);
                        bool    did = MathTools.LineLineIntersection(out vi, n1.pos, n2.pos - n1.pos, l1, l2 - l1);

                        if (vi.x > n1.pos.x && vi.x < n2.pos.x)
                        {
                            r.ds(vi, "IIIII:" + r.name);
                            Node n = new Node(vi, n1.NodeName);
                            NewNodes.Add(n);
                        }
                    }
                    NewNodes.Add(n2);
                }
                r.nodes.Clear();
                r.nodes = NewNodes;
            }
        }
Exemple #2
0
        /**
         * <summary>
         * v1s = start of segment 1
         * v1e = end of segment 1
         * v2s = start of segment 2
         * v2e = end of segment 2
         * mv1e = pulled back position on v1-v2
         * mvs2 = pulled back position on v2-v3
         * n1 = planar normal of v1
         * n2 = planar normal of v2
         * </summary>
         * */
        public void CreateSmoothConnection(Vector3 v1s, Vector3 v1e, Vector3 v2s, Vector3 v2e,
                                           Vector3 mv1e, Vector3 mv2s,
                                           Vector3 n1, Vector3 n2)
        {
            float numdivs = 5;
            float step    = 1.0f / numdivs;

            //ds(v1s, "v1s");
            //ds(v1e, "v1e");

            //ds(v2s, "v2s");
            //ds(v2e, "v2e");

            // ds(mv1e, "mv1e");
            // ds(mv2s, "mv2s");

            //ds(mv1e + n1, "mv1e+n1");
            //ds(mv2s + n2, "mv2s+n2");

            Vector3 i1;
            Vector3 dir1 = (v1e - v1s);
            Vector3 dir2 = (v2e - v2s);

            //we use the 2d version of the vectors
            bool b = MathTools.LineLineIntersection(out i1, v1s + n1, dir1, v2s + n2, dir2);

            if (b == false)
            {
                CreateConnection(mv1e, mv2s, n1, n2);
                return;
            }
            //Debug.Log(b);
            //Debug.Log(i1);

            //ds(i1, "i1");

            Vector3 i2;

            dir1 = (v1e - v1s);
            dir2 = (v2e - v2s);
            b    = MathTools.LineLineIntersection(out i2, v1s - n1, dir1, v2s - n2, dir2);

            //inner curve
            Bezier bez1 = new Bezier(mv1e + n1, i1, i1, mv2s + n2);
            //outer curve
            Bezier bez2 = new Bezier(mv1e - n1, i2, i2, mv2s - n2);

            for (float f = 0; f < 1; f += step)
            {
                Vector3 pt1 = bez1.GetPointAtTime(f);
                //ds(pt1, "bezpt1");
                Vector3 pt2 = bez2.GetPointAtTime(f);
                //ds(pt2, "bezpt2");

                Vector3 pt2e = bez2.GetPointAtTime(f + step);
                //ds(pt2e, "bezpt2e");

                Vector3 pt1e = bez1.GetPointAtTime(f + step);
                // ds(pt1e, "bezpt1e");

                //tri1
                v.Add(pt1);
                t.Add(v.Count - 1);
                u.Add(new Vector2(1, f + step));

                v.Add(pt2e);
                t.Add(v.Count - 1);
                u.Add(new Vector2(0, f));

                v.Add(pt2);
                t.Add(v.Count - 1);
                u.Add(new Vector2(0, f + step));

                //tri 2
                v.Add(pt1e);
                t.Add(v.Count - 1);
                u.Add(new Vector2(0, f));

                v.Add(pt2e);
                t.Add(v.Count - 1);
                u.Add(new Vector2(1, f));

                v.Add(pt1);
                t.Add(v.Count - 1);
                u.Add(new Vector2(0, f + step));
            }

            /*
             *
             * b = MathTools.LineLineIntersection(out i1, v1s - n1, dir1, v2s - n2, dir2);
             * Debug.Log(i1);
             *
             * go = GameObject.CreatePrimitive(PrimitiveType.Sphere);
             * go.transform.position = i1;
             * go.transform.parent = this.go.transform;
             */
        }