public bool Apply(Ets2Node node) { if (node.NodeUID == PrefabNodeUID) { PrefabNode = node; } if (node.NodeUID == StartNodeUID) { StartNode = node; return(true); } else if (node.NodeUID == EndNodeUID) { EndNode = node; return(true); } else if (NodesList.ContainsKey(node.NodeUID)) { NodesList[node.NodeUID] = node; return(true); } else { //Console.WriteLine("Could not apply node " + node.NodeUID.ToString("X16") + " to item " + ItemUID.ToString("X16")); return(false); } }
public void Find(Ets2Node node, ulong item, bool isBackward) { var req = new Ets2ItemSearchRequest { ItemUID = item, Node = node, IsBackward = isBackward, IsForward = !isBackward }; ItemSearchRequests.Add(req); }
public void ParseNodes() { if (Empty) { return; } Stopwatch sw = new Stopwatch(); sw.Start(); // First determine the number of positions in this file var nodesPieces = BitConverter.ToInt32(Stream, 0x10); int i = Stream.Length; do { i -= 56; // each block is 56 bytes long var node = new Ets2Node(Stream, i); if (node.NodeUID == 0) { FooterStart = i + 56 - 4; break; } Nodes.Add(node); if (Mapper.Nodes.ContainsKey(node.NodeUID) == false) { Mapper.Nodes.TryAdd(node.NodeUID, node); } var count = BitConverter.ToInt32(Stream, i - 4); if (count >= nodesPieces && count == Nodes.Count) { FooterStart = i - 4; break; } } while (i > 60); //Console.WriteLine("Thereby footer starts at " + FooterStart.ToString("X16")); if (FooterStart < 0) { NoFooterError = true; return; } sw.Stop(); //Console.WriteLine(Path.GetFileNameWithoutExtension(FilePath) + " contains " + Nodes.Count + // " nodes; parsed in " + sw.ElapsedMilliseconds + "ms"); }
public Ets2NavigationSegment(IEnumerable<Ets2Item> roadPath, Ets2NavigationSegment prevSeg) { Type = Ets2NavigationSegmentType.Road; Roads = roadPath.ToList(); // Generate entry/exit noads & road item order var firstRoad = Roads.FirstOrDefault(); var lastRoad = Roads.LastOrDefault(); if (prevSeg.Prefab.NodesList.ContainsValue(firstRoad.StartNode)) { Entry = firstRoad.StartNode; Exit = lastRoad.EndNode; ReversedRoadChain = false; ReversedRoadElements = false; } else if (prevSeg.Prefab.NodesList.ContainsValue(firstRoad.EndNode)) { Entry = firstRoad.EndNode; Exit = lastRoad.StartNode; ReversedRoadChain = false; ReversedRoadElements = true; } else if (prevSeg.Prefab.NodesList.ContainsValue(lastRoad.StartNode)) { Entry = lastRoad.StartNode; Exit = firstRoad.EndNode; ReversedRoadChain = true; ReversedRoadElements = false; } else if ( prevSeg.Prefab.NodesList.ContainsValue(lastRoad.EndNode)) { Entry = lastRoad.EndNode; Exit = firstRoad.StartNode; ReversedRoadChain = true; ReversedRoadElements = true; } else { } }
public Ets2NavigationSegment(IEnumerable <Ets2Item> roadPath, Ets2NavigationSegment prevSeg) { Type = Ets2NavigationSegmentType.Road; Roads = roadPath.ToList(); // Generate entry/exit noads & road item order var firstRoad = Roads.FirstOrDefault(); var lastRoad = Roads.LastOrDefault(); if (prevSeg.Prefab.NodesList.ContainsValue(firstRoad.StartNode)) { Entry = firstRoad.StartNode; Exit = lastRoad.EndNode; ReversedRoadChain = false; ReversedRoadElements = false; } else if (prevSeg.Prefab.NodesList.ContainsValue(firstRoad.EndNode)) { Entry = firstRoad.EndNode; Exit = lastRoad.StartNode; ReversedRoadChain = false; ReversedRoadElements = true; } else if (prevSeg.Prefab.NodesList.ContainsValue(lastRoad.StartNode)) { Entry = lastRoad.StartNode; Exit = firstRoad.EndNode; ReversedRoadChain = true; ReversedRoadElements = false; } else if (prevSeg.Prefab.NodesList.ContainsValue(lastRoad.EndNode)) { Entry = lastRoad.EndNode; Exit = firstRoad.StartNode; ReversedRoadChain = true; ReversedRoadElements = true; } else { } }
public IEnumerable<IEnumerable<PointF>> GeneratePolygonCurves(Ets2Node node, int nodeOr) { List<IEnumerable<PointF>> ks = new List<IEnumerable<PointF>>(); var steps = 16; if (nodeOr >= this.Nodes.Count) nodeOr = 0; if (Nodes.Any() == false) return ks; //Console.WriteLine("Rendering prefab " + Path.GetFileNameWithoutExtension(FilePath) + " Or " + nodeOr + " yaw " + Math.Round(180.0f/Math.PI*yaw)); var xOr = node.X; var yOr = node.Z; var yaw = node.Yaw - this.Nodes[nodeOr].Yaw + Math.PI/2; foreach (var curve in Curves) { var ps = new PointF[steps]; var srx = curve.StartX - this.Nodes[nodeOr].X; var erx = curve.EndX - this.Nodes[nodeOr].X; var sry = curve.StartZ - this.Nodes[nodeOr].Z; var ery = curve.EndZ - this.Nodes[nodeOr].Z; var sr = (float) Math.Sqrt(srx * srx + sry * sry); var er = (float)Math.Sqrt(erx * erx + ery * ery); var ans = yaw - Math.Atan2(sry,srx); var ane = yaw - Math.Atan2(ery, erx); var sx = xOr - sr * (float)Math.Sin(ans); var ex = xOr - er * (float)Math.Sin(ane); var sy = yOr - sr * (float)Math.Cos(ans); var ey = yOr - er * (float)Math.Cos(ane); // tmp ps = new PointF[2]; ps[0] = new PointF(sx, sy); ps[1] = new PointF(ex, ey); ks.Add(ps); continue; var tangentSX = (float)Math.Cos(ans) * curve.Length; var tangentEX = (float)Math.Cos(ane) * curve.Length; var tangentSY = (float)Math.Sin(ans) * curve.Length; var tangentEY = (float)Math.Sin(ane) * curve.Length; for (int k = 0; k < steps; k++) { var s = (float)k / (float)steps; var x = (float)Ets2CurveHelper.Hermite(s, sx, ex, tangentSX, tangentEX); var y = (float)Ets2CurveHelper.Hermite(s, sy, ey, tangentSY, tangentEY); ps[k] = new PointF(x, y); } ks.Add(ps); } return ks; }
public IEnumerable<Ets2Point> GeneratePolygonForRoute(Ets2PrefabRoute route, Ets2Node node, int nodeOr) { List<Ets2Point> p = new List<Ets2Point>(); if (route == null || route.Route == null) return p; /* yaw -= this.Nodes[nodeOr].Yaw; yaw += Math.PI/2; */ var xOr = node.X; var yOr = node.Z; var yaw = node.Yaw - this.Nodes[nodeOr].Yaw + Math.PI / 2; foreach (var curve in route.Route) { var srx = curve.StartX - this.Nodes[nodeOr].X; var erx = curve.EndX - this.Nodes[nodeOr].X; var sry = curve.StartZ - this.Nodes[nodeOr].Z; var ery = curve.EndZ - this.Nodes[nodeOr].Z; var sr = (float) Math.Sqrt(srx*srx + sry*sry); var er = (float) Math.Sqrt(erx*erx + ery*ery); var ans = yaw - Math.Atan2(sry, srx); var ane = yaw - Math.Atan2(ery, erx); var sx = xOr - sr*(float) Math.Sin(ans); var ex = xOr - er*(float) Math.Sin(ane); var sy = yOr - sr*(float) Math.Cos(ans); var ey = yOr - er*(float) Math.Cos(ane); // tmp var ps = new Ets2Point[2]; ps[0] = new Ets2Point(sx, node.Y, sy,(float) ans); ps[1] = new Ets2Point(ex, node.Y, ey, (float)ane); p.AddRange(ps); } return p; }
public IEnumerable <IEnumerable <PointF> > GeneratePolygonCurves(Ets2Node node, int nodeOr) { List <IEnumerable <PointF> > ks = new List <IEnumerable <PointF> >(); var steps = 16; if (nodeOr >= this.Nodes.Count) { nodeOr = 0; } if (Nodes.Any() == false) { return(ks); } //Console.WriteLine("Rendering prefab " + Path.GetFileNameWithoutExtension(FilePath) + " Or " + nodeOr + " yaw " + Math.Round(180.0f/Math.PI*yaw)); var xOr = node.X; var yOr = node.Z; var yaw = node.Yaw - this.Nodes[nodeOr].Yaw + Math.PI / 2; foreach (var curve in Curves) { var ps = new PointF[steps]; var srx = curve.StartX - this.Nodes[nodeOr].X; var erx = curve.EndX - this.Nodes[nodeOr].X; var sry = curve.StartZ - this.Nodes[nodeOr].Z; var ery = curve.EndZ - this.Nodes[nodeOr].Z; var sr = (float)Math.Sqrt(srx * srx + sry * sry); var er = (float)Math.Sqrt(erx * erx + ery * ery); var ans = yaw - Math.Atan2(sry, srx); var ane = yaw - Math.Atan2(ery, erx); var sx = xOr - sr * (float)Math.Sin(ans); var ex = xOr - er * (float)Math.Sin(ane); var sy = yOr - sr * (float)Math.Cos(ans); var ey = yOr - er * (float)Math.Cos(ane); // tmp ps = new PointF[2]; ps[0] = new PointF(sx, sy); ps[1] = new PointF(ex, ey); ks.Add(ps); continue; var tangentSX = (float)Math.Cos(ans) * curve.Length; var tangentEX = (float)Math.Cos(ane) * curve.Length; var tangentSY = (float)Math.Sin(ans) * curve.Length; var tangentEY = (float)Math.Sin(ane) * curve.Length; for (int k = 0; k < steps; k++) { var s = (float)k / (float)steps; var x = (float)Ets2CurveHelper.Hermite(s, sx, ex, tangentSX, tangentEX); var y = (float)Ets2CurveHelper.Hermite(s, sy, ey, tangentSY, tangentEY); ps[k] = new PointF(x, y); } ks.Add(ps); } return(ks); }
public IEnumerable <Ets2Point> GeneratePolygonForRoute(Ets2PrefabRoute route, Ets2Node node, int nodeOr) { List <Ets2Point> p = new List <Ets2Point>(); if (route == null || route.Route == null) { return(p); } /* * yaw -= this.Nodes[nodeOr].Yaw; * yaw += Math.PI/2; */ var xOr = node.X; var yOr = node.Z; var yaw = node.Yaw - this.Nodes[nodeOr].Yaw + Math.PI / 2; foreach (var curve in route.Route) { var srx = curve.StartX - this.Nodes[nodeOr].X; var erx = curve.EndX - this.Nodes[nodeOr].X; var sry = curve.StartZ - this.Nodes[nodeOr].Z; var ery = curve.EndZ - this.Nodes[nodeOr].Z; var sr = (float)Math.Sqrt(srx * srx + sry * sry); var er = (float)Math.Sqrt(erx * erx + ery * ery); var ans = yaw - Math.Atan2(sry, srx); var ane = yaw - Math.Atan2(ery, erx); var sx = xOr - sr * (float)Math.Sin(ans); var ex = xOr - er * (float)Math.Sin(ane); var sy = yOr - sr * (float)Math.Cos(ans); var ey = yOr - er * (float)Math.Cos(ane); // tmp var ps = new Ets2Point[2]; ps[0] = new Ets2Point(sx, node.Y, sy, (float)ans); ps[1] = new Ets2Point(ex, node.Y, ey, (float)ane); p.AddRange(ps); } return(p); }
public bool Apply(Ets2Node node) { if (node.NodeUID == PrefabNodeUID) { PrefabNode = node; } if (node.NodeUID == StartNodeUID) { StartNode = node; return true; } else if (node.NodeUID == EndNodeUID) { EndNode = node; return true; } else if (NodesList.ContainsKey(node.NodeUID)) { NodesList[node.NodeUID] = node; return true; } else { //Console.WriteLine("Could not apply node " + node.NodeUID.ToString("X16") + " to item " + ItemUID.ToString("X16")); return false; } }
public void FindItems(Ets2Node node, bool postpone) { if (node.ForwardItemUID > 0) { Ets2Item itemForward; if (Mapper.Items.TryGetValue(node.ForwardItemUID, out itemForward)) { if (itemForward.Apply(node)) { node.ForwardItem = itemForward; } } else { itemForward = FindItem(node.ForwardItemUID); if (itemForward == null) { if (postpone) { Mapper.Find(node, node.ForwardItemUID, false); } } else { Items.Add(itemForward); Mapper.Items.TryAdd(node.ForwardItemUID, itemForward); node.ForwardItem = itemForward; if (itemForward.Apply(node)) { node.ForwardItem = itemForward; } } } } if (node.BackwardItemUID > 0) { Ets2Item itemBackward; if (Mapper.Items.TryGetValue(node.BackwardItemUID, out itemBackward)) { if (itemBackward.Apply(node)) { node.BackwardItem = itemBackward; } } else { itemBackward = FindItem(node.BackwardItemUID); if (itemBackward == null) { if (postpone) { Mapper.Find(node, node.BackwardItemUID, true); } } else { Items.Add(itemBackward); Mapper.Items.TryAdd(node.BackwardItemUID, itemBackward); node.BackwardItem = itemBackward; if (itemBackward.Apply(node)) { node.BackwardItem = itemBackward; } } } } }
public void Find(Ets2Node node, ulong item, bool isBackward) { var req = new Ets2ItemSearchRequest { ItemUID = item, Node = node, IsBackward = isBackward, IsForward = !isBackward }; ItemSearchRequests.Add(req); }
public void ParseNodes() { if (Empty) return; Stopwatch sw = new Stopwatch(); sw.Start(); // First determine the number of positions in this file var nodesPieces = BitConverter.ToInt32(Stream, 0x10); int i = Stream.Length; do { i -= 56; // each block is 56 bytes long var node = new Ets2Node(Stream, i); if (node.NodeUID == 0) { FooterStart = i + 56 - 4; break; } Nodes.Add(node); if (Mapper.Nodes.ContainsKey(node.NodeUID) == false) Mapper.Nodes.TryAdd(node.NodeUID, node); var count = BitConverter.ToInt32(Stream, i - 4); if (count >= nodesPieces && count == Nodes.Count) { FooterStart = i - 4; break; } } while (i > 60); //Console.WriteLine("Thereby footer starts at " + FooterStart.ToString("X16")); if (FooterStart < 0) { NoFooterError = true; return; } sw.Stop(); //Console.WriteLine(Path.GetFileNameWithoutExtension(FilePath) + " contains " + Nodes.Count + // " nodes; parsed in " + sw.ElapsedMilliseconds + "ms"); }
public void FindItems(Ets2Node node, bool postpone) { if (node.ForwardItemUID > 0) { Ets2Item itemForward; if (Mapper.Items.TryGetValue(node.ForwardItemUID, out itemForward)) { if (itemForward.Apply(node)) node.ForwardItem = itemForward; } else { itemForward = FindItem(node.ForwardItemUID); if (itemForward == null) { if (postpone) Mapper.Find(node, node.ForwardItemUID, false); } else { Items.Add(itemForward); Mapper.Items.TryAdd(node.ForwardItemUID, itemForward); node.ForwardItem = itemForward; if (itemForward.Apply(node)) node.ForwardItem = itemForward; } } } if (node.BackwardItemUID > 0) { Ets2Item itemBackward; if (Mapper.Items.TryGetValue(node.BackwardItemUID, out itemBackward)) { if (itemBackward.Apply(node)) node.BackwardItem = itemBackward; } else { itemBackward = FindItem(node.BackwardItemUID); if (itemBackward == null) { if (postpone) Mapper.Find(node, node.BackwardItemUID, true); } else { Items.Add(itemBackward); Mapper.Items.TryAdd(node.BackwardItemUID, itemBackward); node.BackwardItem = itemBackward; if (itemBackward.Apply(node)) node.BackwardItem = itemBackward; } } } }