private string SaveCordonMap(Document document, string folder) { var filename = Path.ChangeExtension(document.MapFileName, ".map"); var map = document.Map; if (document.Map.Cordon) { map = new Map(); map.WorldSpawn.EntityData = document.Map.WorldSpawn.EntityData.Clone(); var entities = document.Map.WorldSpawn.GetAllNodesContainedWithin(document.Map.CordonBounds); foreach (var mo in entities) { var clone = mo.Clone(); clone.SetParent(map.WorldSpawn); } var outside = new Box(map.WorldSpawn.GetChildren().Select(x => x.BoundingBox).Union(new[] { document.Map.CordonBounds })); outside = new Box(outside.Start - Coordinate.One, outside.End + Coordinate.One); var inside = document.Map.CordonBounds; var brush = new Brushes.BlockBrush(); var cordon = (Solid)brush.Create(map.IDGenerator, outside, null, 0).First(); var carver = (Solid)brush.Create(map.IDGenerator, inside, null, 0).First(); cordon.Faces.ForEach(x => x.Texture.Name = "BLACK"); // Do a carve (TODO: move carve into helper method?) foreach (var plane in carver.Faces.Select(x => x.Plane)) { Solid back, front; if (!cordon.Split(plane, out back, out front, map.IDGenerator)) { continue; } front.SetParent(map.WorldSpawn); cordon = back; } if (document.MapFileName.EndsWith(".map")) { filename = Path.GetFileNameWithoutExtension(filename) + "_cordon.map"; } } map.WorldSpawn.EntityData.SetPropertyValue("wad", string.Join(";", document.GetUsedTexturePackages().Select(x => x.PackageRoot).Where(x => x.EndsWith(".wad")))); filename = Path.Combine(folder, filename); MapProvider.SaveMapToFile(filename, map); return(filename); }
private string SaveCordonMap(Document document, string folder) { var filename = Path.ChangeExtension(document.MapFileName, ".map"); var map = document.Map; if (document.Map.Cordon) { map = new Map(); map.WorldSpawn.EntityData = document.Map.WorldSpawn.EntityData.Clone(); var entities = document.Map.WorldSpawn.GetAllNodesContainedWithin(document.Map.CordonBounds); foreach (var mo in entities) { var clone = mo.Clone(); clone.SetParent(map.WorldSpawn); } var outside = new Box(map.WorldSpawn.Children.Select(x => x.BoundingBox).Union(new[] {document.Map.CordonBounds})); outside = new Box(outside.Start - Coordinate.One, outside.End + Coordinate.One); var inside = document.Map.CordonBounds; var brush = new Brushes.BlockBrush(); var cordon = (Solid) brush.Create(map.IDGenerator, outside, null, 0).First(); var carver = (Solid) brush.Create(map.IDGenerator, inside, null, 0).First(); cordon.Faces.ForEach(x => x.Texture.Name = "BLACK"); // Do a carve (TODO: move carve into helper method?) foreach (var plane in carver.Faces.Select(x => x.Plane)) { Solid back, front; if (!cordon.Split(plane, out back, out front, map.IDGenerator)) continue; front.SetParent(map.WorldSpawn); cordon = back; } if (document.MapFileName.EndsWith(".map")) { filename = Path.GetFileNameWithoutExtension(filename) + "_cordon.map"; } } map.WorldSpawn.EntityData.SetPropertyValue("wad", string.Join(";", Game.Wads.Select(x => x.Path))); filename = Path.Combine(folder, filename); MapProvider.SaveMapToFile(filename, map); return filename; }
private void SaveWithCordon(string file) { var map = _document.Map; if (_document.Map.Cordon) { map = new Map(); map.WorldSpawn.EntityData = _document.Map.WorldSpawn.EntityData.Clone(); var entities = _document.Map.WorldSpawn.GetAllNodesContainedWithin(_document.Map.CordonBounds); foreach (var mo in entities) { var clone = mo.Clone(); clone.SetParent(map.WorldSpawn); } var outside = new Box(map.WorldSpawn.Children.Select(x => x.BoundingBox).Union(new[] {_document.Map.CordonBounds})); outside = new Box(outside.Start - Coordinate.One, outside.End + Coordinate.One); var inside = _document.Map.CordonBounds; var brush = new Brushes.BlockBrush(); var cordon = (Solid) brush.Create(map.IDGenerator, outside, null).First(); var carver = (Solid) brush.Create(map.IDGenerator, inside, null).First(); cordon.Faces.ForEach(x => x.Texture.Name = "BLACK"); // Do a carve (TODO: move carve into helper method?) foreach (var plane in carver.Faces.Select(x => x.Plane)) { Solid back, front; if (!cordon.Split(plane, out back, out front, map.IDGenerator)) continue; front.SetParent(map.WorldSpawn); cordon = back; } } MapProvider.SaveMapToFile(file, map); }