public void ReadFromFile(string filePath) { int count = Marshal.SizeOf(typeof(RegionPolygonData)); Polygons.Clear(); using (FileStream fs = new FileStream(filePath, FileMode.Open)) { using (BinaryReader reader = new BinaryReader(fs)) { while (fs.Position < fs.Length) { byte[] readBuffer = reader.ReadBytes(count); GCHandle handle = GCHandle.Alloc(readBuffer, GCHandleType.Pinned); RegionPolygonData data = (RegionPolygonData)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(RegionPolygonData)); handle.Free(); Polygons.Add(data); } } } }
private void Simulate(AnimStage stage = AnimStage.BEFORE_ANIM, bool icons = false) { try { // get regions RegionPolygonBinFile bin = new RegionPolygonBinFile(); bin.ReadFromFile(@"assets\map\points.bin"); Bitmap bmp = new Bitmap(pbPreview.Width, pbPreview.Height); House[] regionOwners = new House[bin.Polygons.Count]; _uibWorkingCopy.GetRegionOwnership(ref regionOwners, (House)_house, _scenario, stage); // paint regions using (Graphics g = Graphics.FromImage(bmp)) { g.DrawImage(new Bitmap(@"assets\map\dunemap2.png"), pbPreview.DisplayRectangle); for (int r = 0; r < bin.Polygons.Count; r++) { RegionPolygonData data = bin.Polygons[r]; Point[] pts = new Point[data.Polygon.Length]; for (int i = 0; i < pts.Length; i++) { pts[i] = data.Polygon[i].ToPoint(); } int owner = (int)regionOwners[r]; if (owner == owner.Clamp(0, 2)) { using (Brush brush = new HatchBrush(HatchStyle.Percent50, Color.FromArgb(0xCF, _houseColors[owner]), Color.Transparent)) { g.FillPolygon(brush, pts); } } using (Pen pen = new Pen(Color.FromArgb(0x7F, Color.Black))) { g.DrawPolygon(pen, pts); } if (icons) { CampaignMissionData currData = _uibWorkingCopy.Houses[_house].Missions[_scenario]; Size sz = new Size(72, 70); if (currData.RegionID1 == r + 1 || currData.RegionID2 == r + 1) { using (Pen pen = new Pen(Color.Blue, 2)) { g.DrawPolygon(pen, pts); } } using (Pen pen = new Pen(Color.DarkBlue)) { using (Brush brush = new SolidBrush(Color.DarkBlue)) { if (currData.RegionID1 > 0) { Point pt = currData.Region1IconPosition.ToPoint(); g.DrawRectangle(pen, new Rectangle(pt, sz)); g.DrawString(currData.MissionFile1, DefaultFont, brush, pt.X + 10, pt.Y + 10); } if (currData.RegionID2 > 0) { Point pt = currData.Region2IconPosition.ToPoint(); g.DrawRectangle(pen, new Rectangle(pt, sz)); g.DrawString(currData.MissionFile2, DefaultFont, brush, pt.X + 10, pt.Y + 10); } } } } using (Brush brush = new SolidBrush(Color.White)) { g.DrawString("{0}, {1}".F(cbHouse.Text, cbScenario.Text), DefaultFont, brush, new Point(5, 5)); } } } pbPreview.Image?.Dispose(); pbPreview.Image = bmp; } catch { } }