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()); }
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); }