Exemplo n.º 1
0
        private void ReadCrossroad(ICrossroad crossroad, IRoadmapFactory roadmapFactory, XmlNode crossroadNode)
        {
            var pivotPoint = ReadPoint(crossroadNode.SelectSingleNode("pivotPoint"));
            var index      = ushort.Parse(crossroadNode.GetFieldValue("index"));

            crossroad.PivotPoint = pivotPoint;
            crossroad.Index      = index;


            var junctionNodes = crossroadNode.SelectNodes("roadJunctions/roadJunction");

            foreach (XmlNode junctionNode in junctionNodes)
            {
                IRoadJunction junction = roadmapFactory.Junction();
                ReadRoadJunction(junction, roadmapFactory, junctionNode);
                crossroad.Junctions.Add(junction);
            }

            var boundNodes = crossroadNode.SelectNodes("bounds/point");

            foreach (XmlNode pointNode in boundNodes)
            {
                crossroad.Bounds.Add(ReadPoint(pointNode));
            }

            var semaphoreNodes = crossroadNode.SelectNodes("trafficLightSemaphores/semaphore");

            foreach (XmlNode semaphoreNode in semaphoreNodes)
            {
                ITrafficLightSemaphore semaphore = roadmapFactory.TrafficLightSemaphore();
                ReadTrafficLightSemaphore(semaphore, semaphoreNode);
                crossroad.TrafficLightSemaphores.Add(semaphore);
            }
        }
Exemplo n.º 2
0
        private void ReadLane(ILaneDefinition lane, IRoadmapFactory roadmapFactory, XmlNode laneNode)
        {
            var width        = float.Parse(laneNode.GetFieldValue("width"));
            var type         = (LaneType)Enum.Parse(typeof(LaneType), laneNode.GetFieldValue("type"));
            var flags        = (LaneFlags)Enum.Parse(typeof(LaneFlags), laneNode.GetFieldValue("flags"));
            var centerOffset = ushort.Parse(laneNode.GetFieldValue("centerOffset"));

            lane.Width        = width;
            lane.LaneType     = type;
            lane.LaneFlags    = flags;
            lane.CenterOffset = centerOffset;

            var rangeFlagNodes = laneNode.SelectNodes("rangeFlags/rangeFlag");

            foreach (XmlNode rangeFlagNode in rangeFlagNodes)
            {
                IRangeFlag rangeFlag = roadmapFactory.RangeFlag();
                ReadRangeFlag(rangeFlag, rangeFlagNode);
                lane.RangeFlags.Add(rangeFlag);
            }
        }
Exemplo n.º 3
0
        private void ReadRoadJunction(IRoadJunction junction, IRoadmapFactory roadmapFactory, XmlNode junctionNode)
        {
            var from     = ushort.Parse(junctionNode.GetFieldValue("fromRoadGraphEdge"));
            var fromLane = byte.Parse(junctionNode.GetFieldValue("fromLane"));
            var to       = ushort.Parse(junctionNode.GetFieldValue("toRoadGraphEdge"));
            var toLane   = byte.Parse(junctionNode.GetFieldValue("toLane"));
            var unkn6    = byte.Parse(junctionNode.GetFieldValue("unkn6"));
            var unkn8    = ushort.Parse(junctionNode.GetFieldValue("unkn8"));

            var spline = roadmapFactory.Spline();

            ReadSpline(spline, junctionNode.SelectSingleNode("spline"));

            junction.FromRoadGraphEdgeIndex = from;
            junction.FromLaneIndex          = fromLane;
            junction.ToRoadGraphEdgeIndex   = to;
            junction.ToLaneIndex            = toLane;
            junction.Unkn4  = 255; // always 255
            junction.Unkn6  = unkn6;
            junction.Unkn8  = unkn8;
            junction.Spline = spline;
        }
Exemplo n.º 4
0
        private void ReadRoad(IRoadDefinition road, IRoadmapFactory roadmapFactory, XmlNode roadNode)
        {
            var roadGraphEdgeIndex         = StrWithMaxValueNegativeOneToUshort(roadNode.GetFieldValue("roadGraphEdgeIndex"));
            var oppositeRoadGraphEdgeIndex = StrWithMaxValueNegativeOneToUshort(roadNode.GetFieldValue("oppositeRoadGraphEdgeIndex"));
            var oppositeLanesCount         = byte.Parse(roadNode.GetFieldValue("oppositeLanesCount"));
            var forwardLanesCount          = byte.Parse(roadNode.GetFieldValue("forwardLanesCount"));
            var maxSpawnedCars             = byte.Parse(roadNode.GetFieldValue("maxSpawnedCars"));
            var direction   = (RoadDirection)Enum.Parse(typeof(RoadDirection), roadNode.GetFieldValue("direction"));
            var splineIndex = ushort.Parse(roadNode.GetFieldValue("splineIndex"));
            var type        = (RoadType)Enum.Parse(typeof(RoadType), roadNode.GetFieldValue("type"));

            road.RoadGraphEdgeIndex         = roadGraphEdgeIndex;
            road.OppositeRoadGraphEdgeIndex = oppositeRoadGraphEdgeIndex;
            road.OppositeLanesCount         = oppositeLanesCount;
            road.ForwardLanesCount          = forwardLanesCount;
            road.MaxSpawnedCars             = maxSpawnedCars;
            road.Direction       = direction;
            road.RoadSplineIndex = splineIndex;
            road.RoadType        = type;

            var laneNodes = roadNode.SelectNodes("lanes/lane");

            foreach (XmlNode laneNode in laneNodes)
            {
                ILaneDefinition lane = roadmapFactory.Lane();
                ReadLane(lane, roadmapFactory, laneNode);
                road.Lanes.Add(lane);
            }

            var rangeFlagNodes = roadNode.SelectNodes("rangeFlags/rangeFlag");

            foreach (XmlNode rangeFlagNode in rangeFlagNodes)
            {
                IRangeFlag rangeFlag = roadmapFactory.RangeFlag();
                ReadRangeFlag(rangeFlag, rangeFlagNode);
                road.RangeFlags.Add(rangeFlag);
            }
        }
Exemplo n.º 5
0
        public IRoadmap Deserialize(IRoadmapFactory roadmapFactory, string filePath)
        {
            IRoadmap roadmap = roadmapFactory.Roadmap();

            using (FileStream fileStream = File.Open(filePath, FileMode.Open))
            {
                XmlDocument xml = new XmlDocument();
                xml.Load(fileStream);
                XmlElement root = xml.DocumentElement;

                var roadSplinesNode = root.SelectSingleNode("roadSplines");
                foreach (XmlNode splineNode in roadSplinesNode.ChildNodes)
                {
                    if (splineNode.Name == "roadSpline")
                    {
                        IRoadSpline spline = roadmapFactory.Spline();
                        ReadSpline(spline, splineNode);
                        roadmap.Splines.Add(spline);
                    }
                }

                var roadNodes = root.SelectNodes("roads/road");
                foreach (XmlNode roadNode in roadNodes)
                {
                    IRoadDefinition road = roadmapFactory.Road();
                    ReadRoad(road, roadmapFactory, roadNode);
                    roadmap.Roads.Add(road);
                    var fromCrossroad = ushort.Parse(roadNode.GetAttrValue("fromCrossroad"));
                    var toCrossroad   = ushort.Parse(roadNode.GetAttrValue("toCrossroad"));
                    roadmap.RoadToCrossroadMapping.Add(fromCrossroad);
                    roadmap.RoadToCrossroadMapping.Add(toCrossroad);
                }

                var crossroadNodes = root.SelectNodes("crossroads/crossroad");
                foreach (XmlNode crossroadNode in crossroadNodes)
                {
                    ICrossroad crossroad = roadmapFactory.Crossroad();
                    ReadCrossroad(crossroad, roadmapFactory, crossroadNode);
                    roadmap.Crossroads.Add(crossroad);
                }

                var roadGraphEdgeNodes = root.SelectNodes("roadGraph/roadGraphEdge");
                foreach (XmlNode edgeNode in roadGraphEdgeNodes)
                {
                    ICostMapEntry costMapEntry = roadmapFactory.CostMapEntry();
                    roadmap.CostMap.Add(costMapEntry);

                    var type = (RoadGraphEdgeType)Enum.Parse(typeof(RoadGraphEdgeType), edgeNode.GetFieldValue("edgeType"));
                    var cost = ushort.Parse(edgeNode.GetFieldValue("cost"));
                    costMapEntry.RoadGraphEdgeType = type;
                    costMapEntry.Cost = cost;

                    if (type == RoadGraphEdgeType.Road)
                    {
                        var roadIndex = ushort.Parse(edgeNode.GetFieldValue("roadIndex"));
                        costMapEntry.RoadGraphEdgeLink = roadIndex;

                        roadmap.AddRoadEdge(roadIndex);
                    }
                    else if (type == RoadGraphEdgeType.CrossroadJunction)
                    {
                        var crossroadIndex  = ushort.Parse(edgeNode.GetFieldValue("crossroadIndex"));
                        var targetRoadIndex = ushort.Parse(edgeNode.GetFieldValue("targetRoadIndex"));

                        costMapEntry.RoadGraphEdgeLink = crossroadIndex;

                        roadmap.AddCrossroadJunctionEdge(targetRoadIndex);
                    }
                }
            }

            return(roadmap);
        }