diff --git a/Game/Assets/Scripts/Generator/RoadGenerator.cs b/Game/Assets/Scripts/Generator/RoadGenerator.cs index ea2632a..00ba354 100644 --- a/Game/Assets/Scripts/Generator/RoadGenerator.cs +++ b/Game/Assets/Scripts/Generator/RoadGenerator.cs @@ -98,15 +98,10 @@ namespace TransportGame.Generator } while (IsObstacle(p0) || IsObstacle(p1) || IsObstacle(p2)); - // Logger.Info("Generated initial segment: {0} -> {1}", p0, p1); - // Logger.Info("Generated initial segment: {0} -> {1}", p0, p2); - // Create root node var node0 = map.RoadNetwork.CreateNode(p0); qtree.Add(node0); - // Logger.Info("Generated root node: {0}", node0); - // Create & enqueue segments queue.Add(new RoadGeneratorSegment(node0, p1, true)); queue.Add(new RoadGeneratorSegment(node0, p2, true)); @@ -114,17 +109,12 @@ namespace TransportGame.Generator public void Step() { - // Logger.Info(">>> BEGAN STEP <<<"); - var segment = queue.OrderBy(x => x.Time).First(); queue.Remove(segment); - // Logger.Info("Dequeued segment {0}", segment); - // Check local constraints if (CheckLocalConstraints(segment)) { - // Logger.Info("Local constraints check succeeded."); RoadSegment createdSegment; // Finish to create segment @@ -142,13 +132,8 @@ namespace TransportGame.Generator { newSegment.Time += segment.Time + 1; queue.Add(newSegment); - // Logger.Info("Added segment to queue: {0}", newSegment); } } - else - { - // Logger.Info("Local constraints check failed!"); - } } private bool IsObstacle(Vector2 p) @@ -173,46 +158,30 @@ namespace TransportGame.Generator bool highway = (segment.LanesTo1 >= 3); bool highwayBranched = false; - // Logger.Info("> Computing global goals. prevPos={0}, dir={1}, highway={2}", prevPos, dir, highway); - // Going straight Vector2 straight = prevPos + dir * ((highway) ? HighwaySegmentLength : DefaultSegmentLength); float straightPopulation = map.GetPopulation(straight); - // Logger.Info("> Straight={0} StraightPopulation={1}", straight, straightPopulation); - // Highways... if (highway) { - // Logger.Info("> Highway case:"); - Vector2 randomStraight = prevPos + HighwaySegmentLength * dir.RotateDeg(random.Next(-MaximumRandomStraightAngle, MaximumRandomStraightAngle)); float randomPopulation = map.GetPopulation(randomStraight); - // Logger.Info("> RandomStraight={0} RandomPopulation={1}", randomStraight, randomPopulation); - if (randomPopulation > straightPopulation) - { - // Logger.Info("> Yielding random straight vector."); yield return new RoadGeneratorSegment(segment.Terminal2, randomStraight, highway); - } else - { - // Logger.Info("> Yielding straight vector."); yield return new RoadGeneratorSegment(segment.Terminal2, straight, highway); - } // Branch highway if (Math.Max(straightPopulation, randomPopulation) > HighwayBranchPopulationTreshold) { - // Logger.Info("> Above treshold. Branching..."); if (random.NextSingle() < HighwayBranchProbability) { Vector2 leftBranch = prevPos + HighwaySegmentLength * dir.RotateDeg(-90 + random.Next(-MaximumBranchAngleVariation, MaximumBranchAngleVariation)); yield return new RoadGeneratorSegment(segment.Terminal2, leftBranch, highway, HighwayBranchDelay); highwayBranched = true; - // Logger.Info("> Branch to the left: {0}", leftBranch); } if (random.NextSingle() < HighwayBranchProbability) { @@ -220,7 +189,6 @@ namespace TransportGame.Generator yield return new RoadGeneratorSegment(segment.Terminal2, rightBranch, highway, HighwayBranchDelay); highwayBranched = true; - // Logger.Info("> Branch to the right: {0}", rightBranch); } } @@ -230,42 +198,29 @@ namespace TransportGame.Generator } else if (random.NextSingle() < straightPopulation) - { - // Logger.Info("> Not highway. Yielding straight vector."); yield return new RoadGeneratorSegment(segment.Terminal2, straight, false); - } // Branch normal road if (straightPopulation > DefaultBranchPopulationTreshold) { - // Logger.Info("Straight population above branch treshold. Branching..."); if (random.NextSingle() < DefaultBranchProbability * straightPopulation) { Vector2 leftBranch = prevPos + HighwaySegmentLength * dir.RotateDeg(-90 + random.Next(-MaximumBranchAngleVariation, MaximumBranchAngleVariation)); yield return new RoadGeneratorSegment(segment.Terminal2, leftBranch, false, (highway) ? HighwayBranchDelay : 0); - - // Logger.Info("> Branch to the left: {0}", leftBranch); } if (random.NextSingle() < DefaultBranchProbability * straightPopulation) { Vector2 rightBranch = prevPos + HighwaySegmentLength * dir.RotateDeg(90 + random.Next(-MaximumBranchAngleVariation, MaximumBranchAngleVariation)); yield return new RoadGeneratorSegment(segment.Terminal2, rightBranch, false, (highway) ? HighwayBranchDelay : 0); - - // Logger.Info("> Branch to the right: {0}", rightBranch); } } } private bool CheckLocalConstraints(RoadGeneratorSegment segment) { - // Logger.Info("Checking local constraints..."); - // Constraint #1: check for obstacles if (IsObstacle(segment.Terminal2Pos)) - { - // Logger.Info("Obstacle."); return false; - } // Constraint #2: slope float segmentLength = (segment.Highway) ? HighwaySegmentLength : DefaultSegmentLength; @@ -273,13 +228,8 @@ namespace TransportGame.Generator map.GetHeight((int)segment.Terminal2Pos.X, (int)segment.Terminal2Pos.Y); float sinSlope = Math.Abs(levelDiff) / segmentLength; - // Logger.Info("Level difference is {0}, slope is (rads) {1}", levelDiff, Math.Asin(sinSlope)); - if (Math.Asin(sinSlope) > SlopeLimit) - { - // Logger.Info("Slope too big!"); return false; - } // Constraint #3: Number of intersecting roads if (segment.Terminal1.ArticulationSegmentIds.Count > MaximumIntersectingRoads) @@ -292,19 +242,13 @@ namespace TransportGame.Generator Math.Max(segment.Terminal1.X, segment.Terminal2Pos.X) + 3 * HighwaySegmentLength, Math.Max(segment.Terminal1.Y, segment.Terminal2Pos.Y) + 3 * HighwaySegmentLength); - // Logger.Info("Searching area {0} for intersecting segments.", queryArea); - IEnumerable segmentIds = Enumerable.Empty(); // Look for nearby segments foreach (var node in qtree.Query(queryArea)) { - // Logger.Info("Found node: {0}", node); if (node == segment.Terminal1) - { - // Logger.Info("Node is originating node. Will ignore."); continue; - } // Too close to another node in the area if ((node.Position - segment.Terminal2Pos).LengthSq < MinNodeDistance * MinNodeDistance) @@ -327,52 +271,39 @@ namespace TransportGame.Generator var line1 = new LineSegment(segment.Terminal1.Position, segment.Terminal2Pos); var line2 = new LineSegment(other.Terminal1.Position, other.Terminal2.Position); - // Logger.Info("Found segment: {0}. Will test intersection between segments {0} and {1}", other, line1, line2); - Vector2? inters = LineSegment.Intersect(line1, line2); // Case #1: there is an intersection with another segment. We cut the rest of the segment if (inters.HasValue && inters.Value != segment.Terminal1.Position) { - // Logger.Info("Found intersection point: {0}", inters); - // Check angle between segments float cos = Vector2.Dot((line1.P1 - line1.P0).Normalized, (line2.P1 - line2.P0).Normalized); if (Math.Abs(Math.Acos(cos)) < RoadSegmentAngleLimit) - { - // Logger.Info("Angle between segments is too small ({0} rads)", Math.Abs(Math.Acos(cos))); return false; - } // Split segment var newNode = map.RoadNetwork.SplitArticulationSegment(other, inters.Value); segment.Terminal2Pos = inters.Value; segment.Terminal2 = newNode; - // Logger.Info("Performed split in point: {0}", newNode); return true; } - else // Logger.Info("Does not intersect."); - // Case #2: no intersection, but the point is close enough to an existing intersection - if ((segment.Terminal2Pos - other.Terminal2.Position).LengthSq <= RoadSnapDistance * RoadSnapDistance) + // Case #2: no intersection, but the point is close enough to an existing intersection + if ((segment.Terminal2Pos - other.Terminal2.Position).LengthSq <= RoadSnapDistance * RoadSnapDistance) + { + // Check angle between intersecting segments + foreach (var intersSeg in other.Terminal2.ArticulationSegments) { - // Check angle between intersecting segments - foreach (var intersSeg in other.Terminal2.ArticulationSegments) - { - float cos = Vector2.Dot((line1.P1 - line1.P0).Normalized, (intersSeg.Terminal2.Position - intersSeg.Terminal1.Position).Normalized); - if (Math.Abs(Math.Acos(cos)) < RoadSegmentAngleLimit) - { - // Logger.Info("Angle between segments is too small ({0} rads)", Math.Abs(Math.Acos(cos))); - return false; - } - } - - // Logger.Info("Point is close to existing intersection: {0}, will snap.", other.Terminal2); - segment.Terminal2Pos = other.Terminal2.Position; - segment.Terminal2 = other.Terminal2; - return true; + float cos = Vector2.Dot((line1.P1 - line1.P0).Normalized, (intersSeg.Terminal2.Position - intersSeg.Terminal1.Position).Normalized); + if (Math.Abs(Math.Acos(cos)) < RoadSegmentAngleLimit) + return false; } + segment.Terminal2Pos = other.Terminal2.Position; + segment.Terminal2 = other.Terminal2; + return true; + } + //// TODO: Case #3: the point is close enough to an existing road segment //float dist = LineSegment.Distance(line2, segment.Terminal2Pos); //if (dist < RoadSnapDistance) diff --git a/Game/UnityVS.Game.CSharp.csproj b/Game/UnityVS.Game.CSharp.csproj index ae3020a..157c132 100644 --- a/Game/UnityVS.Game.CSharp.csproj +++ b/Game/UnityVS.Game.CSharp.csproj @@ -109,5 +109,8 @@ + + + \ No newline at end of file