void prepareChangingLane(bool shouldTurn) { RltDirection turnDir = trajectory.getNextRltDirection(); //Debug.Log(isChangingLanes.ToString() + turnDir.ToString()); if (!isChangingLanes && turnDir != RltDirection.NA) { switch (turnDir) { case RltDirection.Left: if (shouldTurn) { preferedLane = trajectory.getCurrentRoad().getLeftmostLane(); } else if (trajectory.currentLane != trajectory.getCurrentRoad().getLeftmostLane()) { preferedLane = trajectory.getLeftAdjacentLane(); } break; case RltDirection.Right: if (shouldTurn) { preferedLane = trajectory.getCurrentRoad().getRightmostLane(); } else if (trajectory.currentLane != trajectory.getCurrentRoad().getRightmostLane()) { preferedLane = trajectory.getRightAdjacentLane(); } break; default: preferedLane = trajectory.getCurrentLane(); break; } if (preferedLane != trajectory.getCurrentLane()) { changeLane(preferedLane); } } }
public static AbsDirection addDirection(AbsDirection absDir, RltDirection rrtDir) { if (rrtDir == RltDirection.Straight) { return(absDir); } else if (rrtDir == RltDirection.Left) { return((AbsDirection)(((int)absDir + 3) % 4)); } else if (rrtDir == RltDirection.Right) { return((AbsDirection)(((int)absDir + 1) % 4)); } else { Debug.Log("Util - addDirection - No RltDirection : " + rrtDir); return(AbsDirection.NA); } }
private int getNextDestination(AbsDirection prvDirection, Junction currentJunction, List <Road> roads, ref Road nextRoad) { if (currentJunction.isNullJunction) { return(-1); } int failedDirection = 0; bool[] failedDirIndex = new bool[3]; failedDirIndex[0] = false; failedDirIndex[1] = false; failedDirIndex[2] = false; while (failedDirection < 3) { // sample next destination RltDirection direction = getRandomDirection(failedDirIndex); if (direction == RltDirection.NA) { Debug.Log("ERROR : Trajectory - getNextDestination - Error in generating random direction"); return(-1); } if (direction == RltDirection.Straight) { if (currentJunction.connectRoadIdx[(int)prvDirection] >= 0) { nextRoad = roads[currentJunction.connectRoadIdx[(int)prvDirection]]; return((int)Util.addDirection(prvDirection, direction)); } else { failedDirIndex[(int)RltDirection.Straight] = true; failedDirection++; } } else if (direction == RltDirection.Left) { if (currentJunction.connectRoadIdx[((int)prvDirection + 3) % 4] >= 0) { nextRoad = roads[currentJunction.connectRoadIdx[((int)prvDirection + 3) % 4]]; return((int)Util.addDirection(prvDirection, direction)); } else { failedDirIndex[(int)RltDirection.Left] = true; failedDirection++; } } else if (direction == RltDirection.Right) { if (currentJunction.connectRoadIdx[((int)prvDirection + 1) % 4] >= 0) { nextRoad = roads[currentJunction.connectRoadIdx[((int)prvDirection + 1) % 4]]; return((int)Util.addDirection(prvDirection, direction)); } else { failedDirIndex[(int)RltDirection.Right] = true; failedDirection++; } } } return(-1); }