예제 #1
0
    private IEnumerator Coroutine_Generate()
    {
        InitLists();
        while (mQueue.Count > 0)
        {
            Debug.Log("Generating");
            mQueryRoad = mQueue[0];
            mQueue.RemoveAt(0);
            eRoadQueryResult result = LocalConstraints(mQueryRoad);
            if (result != eRoadQueryResult.FAIL)
            {
                mModules.Add(mQueryRoad);
                if (result == eRoadQueryResult.SUCCESS)
                {
                    GlobalGoals(mQueryRoad);
                }
            }
            yield return(new WaitForEndOfFrame());
        }
        for (int i = 0; i < mModules.Count; ++i)
        {
            if (mModules[i].mLength <= 0.000001f)
            {
                Debug.Log("Road with no length!");
            }

            GetNode(mModules[i].mPosition).AddConnection(GetNode(mModules[i].End));
            GetNode(mModules[i].End).AddConnection(GetNode(mModules[i].mPosition));
            if (mModules[i].mBadRoad == true)
            {
                GetNode(mModules[i].mPosition).mBadNode = true;
                GetNode(mModules[i].End).mBadNode       = true;
            }
            yield return(new WaitForEndOfFrame());
        }
        GetComponent <ParcelGenerator>().GenerateParcels(mNodes.Values.ToList());
        yield return(new WaitForEndOfFrame());
    }
예제 #2
0
    private eRoadQueryResult LocalConstraints(RoadModule aRoadModule)
    {
        eRoadQueryResult result = eRoadQueryResult.SUCCESS;
        bool             valid  = false;
        int debugID             = -1;

        if (aRoadModule.End.x < -mWorldSize || aRoadModule.End.x > mWorldSize || aRoadModule.End.z < -mWorldSize || aRoadModule.End.z > mWorldSize)
        {
            return(eRoadQueryResult.FAIL);
        }

        if (TestIntersection(aRoadModule) == true)
        {
            result  = eRoadQueryResult.SUCCESS_AND_STOP;
            valid   = true;
            debugID = 1;
        }

        if (valid == false && TestCrossing(aRoadModule) == true)
        {
            result  = eRoadQueryResult.SUCCESS_AND_STOP;
            valid   = true;
            debugID = 2;
        }

        if (valid == false && TestExtending(aRoadModule) == true)
        {
            result  = eRoadQueryResult.SUCCESS_AND_STOP;
            valid   = true;
            debugID = 3;
        }

        Vector2 start1 = new Vector2(aRoadModule.mPosition.x, aRoadModule.mPosition.z);
        Vector2 end1   = new Vector2(aRoadModule.End.x, aRoadModule.End.z);

        for (int i = 0; i < mModules.Count; ++i)
        {
            Vector2 start2 = new Vector2(mModules[i].mPosition.x, mModules[i].mPosition.z);
            Vector2 end2   = new Vector2(mModules[i].End.x, mModules[i].End.z);

            if ((start1 == start2 && end1 == end2) || (start1 == end2 && start2 == end1))
            {
                valid = false;
                aRoadModule.mBadRoad = true;
                Debug.Log("OVERLAPPING ROAD");
            }
            else
            {
                ShortenLine(ref start1, ref end1, 0.1f);
                ShortenLine(ref start2, ref end2, 0.1f);
                Vector2 intersection = Vector2.zero;
                if (NeroUtilities.LineLineIntersection(start1, end1, start2, end2, out intersection) == true)
                {
                    valid = false;
                    aRoadModule.mBadRoad = true;
                    Debug.Log("BAD ROAD");
                }
            }
        }

        return(result);
    }