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