예제 #1
0
 public ExtVehicleType GetDefaultAllowedVehicleTypes(NetInfo.Lane laneInfo, VehicleRestrictionsMode busLaneMode)
 {
     ExtVehicleType ret = ExtVehicleType.None;
     if ((laneInfo.m_vehicleType & VehicleInfo.VehicleType.Bicycle) != VehicleInfo.VehicleType.None)
         ret |= ExtVehicleType.Bicycle;
     if ((laneInfo.m_vehicleType & VehicleInfo.VehicleType.Tram) != VehicleInfo.VehicleType.None)
         ret |= ExtVehicleType.Tram;
     if (busLaneMode == VehicleRestrictionsMode.Restricted ||
             (busLaneMode == VehicleRestrictionsMode.Configured && Options.banRegularTrafficOnBusLanes)) {
         if ((laneInfo.m_laneType & NetInfo.LaneType.TransportVehicle) != NetInfo.LaneType.None)
             ret |= ExtVehicleType.RoadPublicTransport | ExtVehicleType.Service | ExtVehicleType.Emergency;
         else if ((laneInfo.m_vehicleType & VehicleInfo.VehicleType.Car) != VehicleInfo.VehicleType.None)
             ret |= ExtVehicleType.RoadVehicle;
     } else {
         if ((laneInfo.m_vehicleType & VehicleInfo.VehicleType.Car) != VehicleInfo.VehicleType.None)
             ret |= ExtVehicleType.RoadVehicle;
     }
     if ((laneInfo.m_vehicleType & (VehicleInfo.VehicleType.Train | VehicleInfo.VehicleType.Metro | VehicleInfo.VehicleType.Monorail)) != VehicleInfo.VehicleType.None)
         ret |= ExtVehicleType.RailVehicle;
     if ((laneInfo.m_vehicleType & VehicleInfo.VehicleType.Ship) != VehicleInfo.VehicleType.None)
         ret |= ExtVehicleType.Ship;
     if ((laneInfo.m_vehicleType & VehicleInfo.VehicleType.Plane) != VehicleInfo.VehicleType.None)
         ret |= ExtVehicleType.Plane;
     if ((laneInfo.m_vehicleType & VehicleInfo.VehicleType.Ferry) != VehicleInfo.VehicleType.None)
         ret |= ExtVehicleType.Ferry;
     if ((laneInfo.m_vehicleType & VehicleInfo.VehicleType.Blimp) != VehicleInfo.VehicleType.None)
         ret |= ExtVehicleType.Blimp;
     if ((laneInfo.m_vehicleType & VehicleInfo.VehicleType.CableCar) != VehicleInfo.VehicleType.None)
         ret |= ExtVehicleType.CableCar;
     return ret;
 }
예제 #2
0
        /// <summary>
        /// Determines the maximum allowed set of vehicles (the base mask) for a given lane
        /// </summary>
        /// <param name="laneInfo"></param>
        /// <returns></returns>
        public ExtVehicleType GetBaseMask(uint laneId, VehicleRestrictionsMode includeBusLanes)
        {
            if (((NetLane.Flags)Singleton <NetManager> .instance.m_lanes.m_buffer[laneId].m_flags & NetLane.Flags.Created) == NetLane.Flags.None)
            {
                return(ExtVehicleType.None);
            }
            ushort segmentId = Singleton <NetManager> .instance.m_lanes.m_buffer[laneId].m_segment;

            if ((Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].m_flags & NetSegment.Flags.Created) == NetSegment.Flags.None)
            {
                return(ExtVehicleType.None);
            }

            NetInfo segmentInfo = Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].Info;
            uint    curLaneId   = Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].m_lanes;
            int     numLanes    = segmentInfo.m_lanes.Length;
            uint    laneIndex   = 0;

            while (laneIndex < numLanes && curLaneId != 0u)
            {
                NetInfo.Lane laneInfo = segmentInfo.m_lanes[laneIndex];
                if (curLaneId == laneId)
                {
                    return(GetBaseMask(laneInfo, includeBusLanes));
                }
                curLaneId = Singleton <NetManager> .instance.m_lanes.m_buffer[curLaneId].m_nextLane;
                ++laneIndex;
            }
            return(ExtVehicleType.None);
        }
예제 #3
0
        /// <summary>
        /// Determines the default set of allowed vehicle types for a given lane.
        /// </summary>
        /// <param name="segmentId"></param>
        /// <param name="segmentInfo"></param>
        /// <param name="laneIndex"></param>
        /// <param name="laneInfo"></param>
        /// <returns></returns>
        internal ExtVehicleType GetDefaultAllowedVehicleTypes(uint laneId, VehicleRestrictionsMode busLaneMode)
        {
            if (((NetLane.Flags)Singleton <NetManager> .instance.m_lanes.m_buffer[laneId].m_flags & NetLane.Flags.Created) == NetLane.Flags.None)
            {
                return(ExtVehicleType.None);
            }
            ushort segmentId = Singleton <NetManager> .instance.m_lanes.m_buffer[laneId].m_segment;

            if ((Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].m_flags & NetSegment.Flags.Created) == NetSegment.Flags.None)
            {
                return(ExtVehicleType.None);
            }

            NetInfo segmentInfo = Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].Info;
            uint    curLaneId   = Singleton <NetManager> .instance.m_segments.m_buffer[segmentId].m_lanes;
            int     numLanes    = segmentInfo.m_lanes.Length;
            uint    laneIndex   = 0;

            while (laneIndex < numLanes && curLaneId != 0u)
            {
                NetInfo.Lane laneInfo = segmentInfo.m_lanes[laneIndex];
                if (curLaneId == laneId)
                {
                    return(GetDefaultAllowedVehicleTypes(segmentId, segmentInfo, laneIndex, laneInfo, busLaneMode));
                }
                curLaneId = Singleton <NetManager> .instance.m_lanes.m_buffer[curLaneId].m_nextLane;
                ++laneIndex;
            }

            return(ExtVehicleType.None);
        }
        public HashSet <ExtVehicleType> GetAllowedVehicleTypesAsSet(
            ushort segmentId,
            ushort nodeId,
            VehicleRestrictionsMode busLaneMode)
        {
            var ret = new HashSet <ExtVehicleType>(
                GetAllowedVehicleTypesAsDict(segmentId, nodeId, busLaneMode).Values);

            return(ret);
        }
예제 #5
0
        /// <summary>
        /// Determines the allowed vehicle types that may approach the given node from the given segment (lane-wise).
        /// </summary>
        /// <param name="segmentId"></param>
        /// <param name="nodeId"></param>
        /// <returns></returns>
        public IDictionary <byte, ExtVehicleType> GetAllowedVehicleTypesAsDict(
            ushort segmentId,
            ushort nodeId,
            VehicleRestrictionsMode busLaneMode)
        {
            IDictionary <byte, ExtVehicleType> ret = new Dictionary <byte, ExtVehicleType>();
            NetManager netManager = Singleton <NetManager> .instance;

            if (segmentId == 0)
            {
                return(ret);
            }

            ref NetSegment netSegment = ref segmentId.ToSegment();
        // TODO optimize method (don't depend on collections!)
        public ExtVehicleType GetAllowedVehicleTypes(ushort segmentId,
                                                     ushort nodeId,
                                                     VehicleRestrictionsMode busLaneMode)
        {
            var ret = ExtVehicleType.None;

            foreach (ExtVehicleType vehicleType in GetAllowedVehicleTypesAsSet(
                         segmentId,
                         nodeId,
                         busLaneMode))
            {
                ret |= vehicleType;
            }

            return(ret);
        }
        /// <summary>
        /// Determines the allowed vehicle types for the given segment and lane.
        /// </summary>
        /// <param name="segmentId"></param>
        /// <param name="laneIndex"></param>
        /// <param name="segmentInfo"></param>
        /// <param name="laneInfo"></param>
        /// <returns></returns>
        public ExtVehicleType GetAllowedVehicleTypes(ushort segmentId,
                                                     NetInfo segmentInfo,
                                                     uint laneIndex,
                                                     NetInfo.Lane laneInfo,
                                                     VehicleRestrictionsMode busLaneMode)
        {
            ExtVehicleType?[] fastArray = Flags.laneAllowedVehicleTypesArray[segmentId];
            if (fastArray != null && fastArray.Length > laneIndex && fastArray[laneIndex] != null)
            {
                return((ExtVehicleType)fastArray[laneIndex]);
            }

            return(GetDefaultAllowedVehicleTypes(
                       segmentId,
                       segmentInfo,
                       laneIndex,
                       laneInfo,
                       busLaneMode));
        }
        /// <summary>
        /// Determines the default set of allowed vehicle types for a given segment and lane.
        /// </summary>
        /// <param name="segmentId"></param>
        /// <param name="segmentInfo"></param>
        /// <param name="laneIndex"></param>
        /// <param name="laneInfo"></param>
        /// <returns></returns>
        public ExtVehicleType GetDefaultAllowedVehicleTypes(
            ushort segmentId,
            NetInfo segmentInfo,
            uint laneIndex,
            NetInfo.Lane laneInfo,
            VehicleRestrictionsMode busLaneMode)
        {
            // manage cached default vehicle types
            if (defaultVehicleTypeCache == null)
            {
                defaultVehicleTypeCache = new ExtVehicleType?[NetManager.MAX_SEGMENT_COUNT][][];
            }

            ExtVehicleType?[] cachedDefaultTypes = null;
            int cacheIndex = (int)busLaneMode;

            if (defaultVehicleTypeCache[segmentId] != null)
            {
                cachedDefaultTypes = defaultVehicleTypeCache[segmentId][cacheIndex];
            }

            if (cachedDefaultTypes == null ||
                cachedDefaultTypes.Length != segmentInfo.m_lanes.Length)
            {
                ExtVehicleType?[][] segmentCache = new ExtVehicleType?[3][];
                segmentCache[0] = new ExtVehicleType?[segmentInfo.m_lanes.Length];
                segmentCache[1] = new ExtVehicleType?[segmentInfo.m_lanes.Length];
                segmentCache[2] = new ExtVehicleType?[segmentInfo.m_lanes.Length];
                defaultVehicleTypeCache[segmentId] = segmentCache;
                cachedDefaultTypes = segmentCache[cacheIndex];
            }

            ExtVehicleType?defaultVehicleType = cachedDefaultTypes[laneIndex];

            if (defaultVehicleType == null)
            {
                defaultVehicleType            = GetDefaultAllowedVehicleTypes(laneInfo, busLaneMode);
                cachedDefaultTypes[laneIndex] = defaultVehicleType;
            }

            return((ExtVehicleType)defaultVehicleType);
        }
        /// <summary>
        /// Determines the allowed vehicle types that may approach the given node from the given segment (lane-wise).
        /// </summary>
        /// <param name="segmentId"></param>
        /// <param name="nodeId"></param>
        /// <returns></returns>
        public IDictionary <byte, ExtVehicleType> GetAllowedVehicleTypesAsDict(
            ushort segmentId,
            ushort nodeId,
            VehicleRestrictionsMode busLaneMode)
        {
            IDictionary <byte, ExtVehicleType> ret = new TinyDictionary <byte, ExtVehicleType>();
            NetManager netManager = Singleton <NetManager> .instance;

            if (segmentId == 0 ||
                (netManager.m_segments.m_buffer[segmentId].m_flags & NetSegment.Flags.Created)
                == NetSegment.Flags.None ||
                nodeId == 0 ||
                (netManager.m_nodes.m_buffer[nodeId].m_flags & NetNode.Flags.Created)
                == NetNode.Flags.None)
            {
                return(ret);
            }

            const NetInfo.Direction DIR = NetInfo.Direction.Forward;

            NetInfo.Direction dir2 =
                ((netManager.m_segments.m_buffer[segmentId].m_flags & NetSegment.Flags.Invert)
                 == NetSegment.Flags.None)
                    ? DIR
                    : NetInfo.InvertDirection(DIR);

            NetInfo segmentInfo = netManager.m_segments.m_buffer[segmentId].Info;
            uint    curLaneId   = netManager.m_segments.m_buffer[segmentId].m_lanes;
            int     numLanes    = segmentInfo.m_lanes.Length;
            uint    laneIndex   = 0;

            while (laneIndex < numLanes && curLaneId != 0u)
            {
                NetInfo.Lane laneInfo = segmentInfo.m_lanes[laneIndex];

                if (laneInfo.m_laneType == NetInfo.LaneType.Vehicle ||
                    laneInfo.m_laneType == NetInfo.LaneType.TransportVehicle)
                {
                    if ((laneInfo.m_vehicleType & VEHICLE_TYPES) != VehicleInfo.VehicleType.None)
                    {
                        ushort toNodeId =
                            (laneInfo.m_finalDirection & dir2) != NetInfo.Direction.None
                                ? netManager.m_segments.m_buffer[segmentId].m_endNode
                                : netManager.m_segments.m_buffer[segmentId].m_startNode;

                        if ((laneInfo.m_finalDirection & NetInfo.Direction.Both) ==
                            NetInfo.Direction.Both || toNodeId == nodeId)
                        {
                            ExtVehicleType vehicleTypes = GetAllowedVehicleTypes(
                                segmentId,
                                segmentInfo,
                                laneIndex,
                                laneInfo,
                                busLaneMode);
                            ret[(byte)laneIndex] = vehicleTypes;
                        }
                    }
                }

                curLaneId = netManager.m_lanes.m_buffer[curLaneId].m_nextLane;
                ++laneIndex;
            }

            return(ret);
        }
 /// <summary>
 /// Determines the maximum allowed set of vehicles (the base mask) for a given lane
 /// </summary>
 /// <param name="laneInfo"></param>
 /// <returns></returns>
 public ExtVehicleType GetBaseMask(NetInfo.Lane laneInfo,
                                   VehicleRestrictionsMode includeBusLanes)
 {
     return(GetDefaultAllowedVehicleTypes(laneInfo, includeBusLanes));
 }
        public ExtVehicleType GetDefaultAllowedVehicleTypes(NetInfo.Lane laneInfo,
                                                            VehicleRestrictionsMode busLaneMode)
        {
            var ret = ExtVehicleType.None;

            if ((laneInfo.m_vehicleType & VehicleInfo.VehicleType.Bicycle) !=
                VehicleInfo.VehicleType.None)
            {
                ret |= ExtVehicleType.Bicycle;
            }

            if ((laneInfo.m_vehicleType & VehicleInfo.VehicleType.Tram) !=
                VehicleInfo.VehicleType.None)
            {
                ret |= ExtVehicleType.Tram;
            }

            switch (busLaneMode)
            {
            case VehicleRestrictionsMode.Restricted:
            case VehicleRestrictionsMode.Configured when Options.banRegularTrafficOnBusLanes: {
                    if ((laneInfo.m_laneType & NetInfo.LaneType.TransportVehicle) !=
                        NetInfo.LaneType.None)
                    {
                        ret |= ExtVehicleType.RoadPublicTransport
                               | ExtVehicleType.Service
                               | ExtVehicleType.Emergency;
                    }
                    else if ((laneInfo.m_vehicleType & VehicleInfo.VehicleType.Car) !=
                             VehicleInfo.VehicleType.None)
                    {
                        ret |= ExtVehicleType.RoadVehicle;
                    }

                    break;
            }

            default: {
                    if ((laneInfo.m_vehicleType & VehicleInfo.VehicleType.Car) !=
                        VehicleInfo.VehicleType.None)
                    {
                        ret |= ExtVehicleType.RoadVehicle;
                    }

                    break;
            }
            }

            // TODO: Mapping from VehicleInfo.VehicleType to bit flags can be improved by a lookup table
            if ((laneInfo.m_vehicleType & (VehicleInfo.VehicleType.Train |
                                           VehicleInfo.VehicleType.Metro |
                                           VehicleInfo.VehicleType.Monorail)) !=
                VehicleInfo.VehicleType.None)
            {
                ret |= ExtVehicleType.RailVehicle;
            }

            if ((laneInfo.m_vehicleType & VehicleInfo.VehicleType.Ship) !=
                VehicleInfo.VehicleType.None)
            {
                ret |= ExtVehicleType.Ship;
            }

            if ((laneInfo.m_vehicleType & VehicleInfo.VehicleType.Plane) !=
                VehicleInfo.VehicleType.None)
            {
                ret |= ExtVehicleType.Plane;
            }

            if ((laneInfo.m_vehicleType & VehicleInfo.VehicleType.Ferry) !=
                VehicleInfo.VehicleType.None)
            {
                ret |= ExtVehicleType.Ferry;
            }

            if ((laneInfo.m_vehicleType & VehicleInfo.VehicleType.Blimp) !=
                VehicleInfo.VehicleType.None)
            {
                ret |= ExtVehicleType.Blimp;
            }

            if ((laneInfo.m_vehicleType & VehicleInfo.VehicleType.CableCar) !=
                VehicleInfo.VehicleType.None)
            {
                ret |= ExtVehicleType.CableCar;
            }

            return(ret);
        }
예제 #12
0
 public ExtVehicleType GetAllowedVehicleTypes(ushort segmentId, ushort nodeId, VehicleRestrictionsMode busLaneMode)
 {
     // TODO optimize method (don't depend on collections!)
     ExtVehicleType ret = ExtVehicleType.None;
     foreach (ExtVehicleType vehicleType in GetAllowedVehicleTypesAsSet(segmentId, nodeId, busLaneMode)) {
         ret |= vehicleType;
     }
     return ret;
 }