예제 #1
0
    void Init(ref GameObject feaObj, Feature fea)
    {
        fid           = fea.GetFID();
        original      = fea.GetFieldAsInteger("original");
        startCorssing = fea.GetFieldAsInteger("start");
        endCrossing   = fea.GetFieldAsInteger("end");
        s2e_ways      = fea.GetFieldAsInteger("s2e_ways");
        e2s_ways      = fea.GetFieldAsInteger("e2s_ways");
        roadwidth     = (s2e_ways + e2s_ways) * SpeedRoad.RoadwayWidth;


        var pts = SpeedRoadUtils.RemoveSamePoint(fea.GetGeometryRef());

        pts = SpeedRoadUtils.OptimizeLine(pts);
        SpeedRoadUtils.CutCrossing(startCorssing, endCrossing, ref pts, roadwidth);
        List <Vector3> vertex = new List <Vector3>();

        for (int i = 0; i < MAGICNUM * (pts.Count - 1); i++)
        {
            vertex.Add(Vector3.zero);
        }

        int ptindex = 0;

        for (int i = 0; i < pts.Count - 1; i++)
        {
            SpeedRoadUtils.Widen(ref vertex, pts[i], pts[i + 1], ptindex, roadwidth);
            SpeedRoadUtils.Corner(ref vertex, ptindex);
            ptindex += MAGICNUM;
        }


        CreateMesh(ref vertex, feaObj);
        feaObj.name = fid.ToString();
    }
예제 #2
0
    static public List <Vector3> OptimizeLine(List <Vector3> lst)
    {
        if (lst.Count == 2)
        {
            return(lst);
        }
        List <Vector3> result = new List <Vector3>();

        result.Add(lst[0]);
        result.Add(lst[1]);

        var d1 = SpeedRoadUtils.AngleBetween(Vector3.right, lst[1] - lst[0]);

        for (int i = 2; i < lst.Count; i++)
        {
            var d2 = SpeedRoadUtils.AngleBetween(Vector3.right, lst[i] - lst[i - 1]);
            if (Mathf.Abs(d1 - d2) < SpeedRoad.RoadAngleThreshold)
            {
                result.RemoveAt(result.Count - 1);
                //                 Debug.Log("优化线段");
            }
            result.Add(lst[i]);
            d1 = d2;
        }

        Assert.IsTrue(result.Count >= 2);
        return(result);
    }
예제 #3
0
    public List <Vector3> GetPath(bool forward)
    {
        List <Vector3> result = new List <Vector3>();

        for (int i = 0; i < vertexZebraCrossingHead.Count; i += 2)
        {
            result.Add(SpeedRoadUtils.SwapYZ(vertexZebraCrossingHead[i]));
        }
        for (int i = 0; i < vertexWaitingHead.Count; i += 2)
        {
            result.Add(SpeedRoadUtils.SwapYZ(vertexWaitingHead[i]));
        }
        for (int i = 0; i < vertexRoad.Count; i += 2)
        {
            result.Add(SpeedRoadUtils.SwapYZ(vertexRoad[i]));
        }
        for (int i = 0; i < vertexWaitingTail.Count; i += 2)
        {
            result.Add(SpeedRoadUtils.SwapYZ(vertexWaitingTail[i]));
        }
        for (int i = 0; i < vertexZebraCrossingTail.Count; i += 2)
        {
            result.Add(SpeedRoadUtils.SwapYZ(vertexZebraCrossingTail[i]));
        }

        if (!forward)
        {
            result.Reverse();
        }
        return(result);
    }
예제 #4
0
    void CreateMesh(ref List <Vector3> vertexbuf, GameObject feaObj)
    {
        List <float> lstTopPartLen    = new List <float>();
        List <float> lstBottomPartLen = new List <float>();
        var          road2Sidelen     = SpeedRoadUtils.GetRoad2SideLen(vertexbuf, ref lstTopPartLen, ref lstBottomPartLen);
        var          roadCenterlen    = (road2Sidelen.x + road2Sidelen.y) / 2;

        string roadtype = "s" + s2e_ways.ToString() + "e" + e2s_ways.ToString();

        if (roadCenterlen - SpeedRoad.RoadZebraCrossingLength * 2 > 0) // 两端斑马线最少占用长度
        {
            GameObject zebraCrossingHead = SpeedRoadUtils.CreateMesh_Part(ref vertexbuf, feaObj, SpeedRoad.RoadZebraCrossingLength, "zchead", ref vertexZebraCrossingHead);
            SetTexture(vertexZebraCrossingHead, zebraCrossingHead, "ZebraCrossing", 4);
            GameObject zebraCrossingTail = SpeedRoadUtils.CreateMesh_Part(ref vertexbuf, feaObj, SpeedRoad.RoadZebraCrossingLength, "zctail", ref vertexZebraCrossingTail, false);
            SetTexture(vertexZebraCrossingTail, zebraCrossingTail, "ZebraCrossing", 4);

            road2Sidelen  = SpeedRoadUtils.GetRoad2SideLen(vertexbuf, ref lstTopPartLen, ref lstBottomPartLen);
            roadCenterlen = (road2Sidelen.x + road2Sidelen.y) / 2;
            bool bNotOneWay = e2s_ways > 0 && s2e_ways > 0;
            if (bNotOneWay)                                              // 双向车道
            {
                if (roadCenterlen - SpeedRoad.RoadWaitingLength * 2 > 0) // 分割双向候车区
                {
                    GameObject waitingHead = SpeedRoadUtils.CreateMesh_Part(ref vertexbuf, feaObj, SpeedRoad.RoadWaitingLength, "waitinghead", ref vertexWaitingHead);
                    SetTextureWait(vertexWaitingHead, waitingHead, true, e2s_ways);
                    GameObject waitingTail = SpeedRoadUtils.CreateMesh_Part(ref vertexbuf, feaObj, SpeedRoad.RoadWaitingLength, "waitingtail", ref vertexWaitingTail, false);
                    SetTextureWait(vertexWaitingTail, waitingTail, false, s2e_ways);
                }
            }
            else // 单行道
            {
                if (roadCenterlen - SpeedRoad.RoadWaitingLength > 0) // 分割单向候车区
                {
                    if (e2s_ways > 0)
                    {
                        GameObject waitingHead = SpeedRoadUtils.CreateMesh_Part(ref vertexbuf, feaObj, SpeedRoad.RoadWaitingLength, "waitinghead", ref vertexWaitingHead);
                        SetTextureWait(vertexWaitingHead, waitingHead, true, e2s_ways, true);
                    }
                    else if (s2e_ways > 0)
                    {
                        GameObject waitingTail = SpeedRoadUtils.CreateMesh_Part(ref vertexbuf, feaObj, SpeedRoad.RoadWaitingLength, "waitingtail", ref vertexWaitingTail, false);
                        SetTextureWait(vertexWaitingTail, waitingTail, false, s2e_ways, true);
                    }
                    else
                    {
                        Assert.IsTrue(false);
                    }
                }
            }
        }
        GameObject road = SpeedRoadUtils.CreateSegment(vertexbuf, feaObj, "road");

        SetTexture(vertexbuf, road, roadtype, 1);
        vertexRoad = vertexbuf;
    }
예제 #5
0
    //     static public void CreateGeo(List<Vector3> lst, ref Geometry dst)
    //     {
    //         foreach (var item in lst)
    //         {
    //             dst.AddPoint_2D(item.x, item.y);
    //         }
    //         Assert.IsTrue(dst.GetPointCount() >= 2);
    //     }

    static public void Widen(ref List <Vector3> vertexbuf, Vector3 start, Vector3 end, int index, float roadwidth)
    {
        float      rstart   = SpeedRoadUtils.AngleBetween(Vector3.right, end - start);
        Quaternion rotation = Quaternion.Euler(0, 0, -rstart);
        Matrix4x4  m        = Matrix4x4.TRS(Vector3.zero, rotation, Vector3.one);
        Vector3    ss       = m.MultiplyPoint(start);
        Vector3    se       = m.MultiplyPoint(end);
        Matrix4x4  m2       = m.inverse;

        Vector3 halfWidth = new Vector3(0, roadwidth / 2, 0);

        vertexbuf[index + 0] = m2.MultiplyPoint(ss + halfWidth);
        vertexbuf[index + 1] = m2.MultiplyPoint(ss - halfWidth);
        vertexbuf[index + 2] = m2.MultiplyPoint(se + halfWidth);
        vertexbuf[index + 3] = m2.MultiplyPoint(se - halfWidth);
    }
예제 #6
0
    public float GetRoadAngle(bool bhead, ref List <Vector3> lst)
    {
        float          angle  = 0;
        List <Vector3> vertex = null;

        if (bhead)
        {
            if (vertexZebraCrossingHead.Count > 0)
            {
                vertex = vertexZebraCrossingHead;
            }
            else if (vertexRoad.Count > 0)
            {
                vertex = vertexRoad;
            }
            else
            {
                Assert.IsFalse(true);
            }
            var dst = vertex[2] - vertex[0];
            angle = SpeedRoadUtils.AngleBetween(Vector3.right, new Vector3(dst.x, dst.y, 0));
            lst.Add(SpeedRoadUtils.SwapYZ(vertex[0]));
            lst.Add(SpeedRoadUtils.SwapYZ(vertex[1]));
        }
        else
        {
            if (vertexZebraCrossingTail.Count > 0)
            {
                vertex = vertexZebraCrossingTail;
            }
            else if (vertexRoad.Count > 0)
            {
                vertex = vertexRoad;
            }
            else
            {
                Assert.IsFalse(true);
            }
            var dst = vertex[vertex.Count - 4] - vertex[vertex.Count - 2];
            angle = SpeedRoadUtils.AngleBetween(Vector3.right, new Vector3(dst.x, dst.y, 0));
            lst.Add(SpeedRoadUtils.SwapYZ(vertex[vertex.Count - 1]));
            lst.Add(SpeedRoadUtils.SwapYZ(vertex[vertex.Count - 2]));
        }
        return(angle);
    }
예제 #7
0
    void SetTexture(List <Vector3> vertex, GameObject part, string texname, float repeatV)
    {
        var tex = SpeedRoadTexMgr.Instance.GetTex(texname);

        part.GetComponent <MeshRenderer>().material.mainTexture = tex;
        part.GetComponent <MeshRenderer>().material.shader      = Shader.Find("Transparent/Diffuse");


        List <float> lstTopPartLen    = new List <float>();
        List <float> lstBottomPartLen = new List <float>();
        var          len = SpeedRoadUtils.GetRoad2SideLen(vertex, ref lstTopPartLen, ref lstBottomPartLen);

        Vector2[] uv1     = new Vector2[vertex.Count];
        float     repeatU = 1;

        if (part.name == "road")
        {
            repeatU = (len.x + len.y) / 2 / SpeedRoad.RoadwayWidth;
        }
        uv1[0].Set(0, repeatV);
        uv1[1].Set(0, 0);
        Vector2 offset = Vector2.zero;

        for (int i = 2; i <= vertex.Count - 2; i += 2)
        {
            var ratetop = (offset.x + lstTopPartLen[i / 2 - 1]) / len.x;
            uv1[i].Set(repeatU * ratetop, repeatV);
            var ratebottom = (offset.y + lstBottomPartLen[i / 2 - 1]) / len.y;
            uv1[i + 1].Set(repeatU * ratebottom, 0);
            offset.x += lstTopPartLen[i / 2 - 1];
            offset.y += lstBottomPartLen[i / 2 - 1];
        }
        uv1[vertex.Count - 2].Set(repeatU, repeatV);
        uv1[vertex.Count - 1].Set(repeatU, 0);
        part.GetComponent <MeshFilter>().mesh.uv = uv1;
    }
예제 #8
0
    void SetTextureWait(List <Vector3> vertex, GameObject part, bool bhead, int ways, bool oneway = false)
    {
        List <float> lstTopPartLen    = new List <float>();
        List <float> lstBottomPartLen = new List <float>();
        var          len = SpeedRoadUtils.GetRoad2SideLen(vertex, ref lstTopPartLen, ref lstBottomPartLen);

        Vector2[] uv1 = new Vector2[vertex.Count];

        if (bhead)
        {
            uv1[0].Set(0, 1);
            uv1[1].Set(0, 0);
            Vector2 offset = Vector2.zero;
            for (int i = 2; i <= vertex.Count - 2; i += 2)
            {
                var ratetop = (offset.x + lstTopPartLen[i / 2 - 1]) / len.x;
                uv1[i].Set(ratetop, 1);
                var ratebottom = (offset.y + lstBottomPartLen[i / 2 - 1]) / len.y;
                uv1[i + 1].Set(ratebottom, 0);
                offset.x += lstTopPartLen[i / 2 - 1];
                offset.y += lstBottomPartLen[i / 2 - 1];
            }
            uv1[vertex.Count - 2].Set(1, 1);
            uv1[vertex.Count - 1].Set(1, 0);
        }
        else
        {
            uv1[0].Set(1, 0);
            uv1[1].Set(1, 1);
            Vector2 offset = Vector2.zero;
            for (int i = 2; i <= vertex.Count - 2; i += 2)
            {
                var ratetop = (offset.x + lstTopPartLen[i / 2 - 1]) / len.x;
                uv1[i].Set(1 - ratetop, 0);
                var ratebottom = (offset.y + lstBottomPartLen[i / 2 - 1]) / len.y;
                uv1[i + 1].Set(1 - ratebottom, 1);
                offset.x += lstTopPartLen[i / 2 - 1];
                offset.y += lstBottomPartLen[i / 2 - 1];
            }
            uv1[vertex.Count - 2].Set(0, 0);
            uv1[vertex.Count - 1].Set(0, 1);
        }
        part.GetComponent <MeshFilter>().mesh.uv = uv1;

        if (oneway)
        {
            Texture2D tex = SpeedRoadTexMgr.Instance.GetTex("wait" + ways.ToString() + "ways");

//             Color32[] colmain = tex.GetPixels32();
//             var te = new Texture2D(tex.width, tex.height);
//             te.SetPixels32(colmain);
//
//
//             Texture2D arrowtex = SpeedRoadTexMgr.Instance.GetTex("arrowforward");
//             Color32[] colarrow = arrowtex.GetPixels32();
//             te.SetPixels32(colarrow);
//             for (int m = 0; m < 128; m++)
//             {
//                 for (int n = 0; n < 128; n++)
//                 {
//                     te.SetPixel(m, n, Color.red);
//                 }
//             }
//             te.Apply();
            part.GetComponent <MeshRenderer>().material.mainTexture = tex;
            part.GetComponent <MeshRenderer>().material.shader      = Shader.Find("Transparent/Diffuse");
        }
        else
        {
            Material mat    = part.GetComponent <MeshRenderer>().material;
            var      shader = Shader.Find("speedroad/waitarea");
            mat.shader = shader;
            var       textop    = SpeedRoadTexMgr.Instance.GetTex("wait" + ways.ToString() + "waystop");
            Texture2D texbottom = SpeedRoadTexMgr.Instance.GetTex("wait" + ways.ToString() + "waysbottom");
            mat.SetTexture("_Tex1", textop);
            mat.SetTexture("_Tex2", texbottom);
            var repeatU = (len.x + len.y) / 2 / SpeedRoad.RoadwayWidth;
            mat.SetTextureScale("_Tex2", new Vector2(repeatU, 1));
        }
    }