public void ClientRead(ServerNetObject type, NetBuffer msg, float sendingTime) { int eventIndex = msg.ReadRangedInteger(0, (int)Math.Ceiling(MaxNodeCount / (float)MaxNodesPerNetworkEvent)); int nodeCount = msg.ReadRangedInteger(0, MaxNodesPerNetworkEvent); int nodeStartIndex = eventIndex * MaxNodesPerNetworkEvent; Vector2[] nodePositions = new Vector2[nodeStartIndex + nodeCount]; for (int i = 0; i < nodes.Count && i < nodePositions.Length; i++) { nodePositions[i] = nodes[i]; } for (int i = 0; i < nodeCount; i++) { nodePositions[nodeStartIndex + i] = new Vector2(msg.ReadFloat(), msg.ReadFloat()); } if (nodePositions.Any(n => !MathUtils.IsValid(n))) { nodes.Clear(); return; } nodes = nodePositions.ToList(); UpdateSections(); Drawable = nodes.Any(); }
private static List<m.polygon> all(IList<m.polygon> a, IList<m.polygon> b, Func<bool, bool, bool> predicate) { var aPolygons = new Vector2[a.Count][]; for (int i = 0; i < a.Count; i++) aPolygons[i] = a[i].points.Select(x => (Vector2) x).ToArray(); var bPolygons = new Vector2[b.Count][]; for (int i = 0; i < b.Count; i++) bPolygons[i] = b[i].points.Select(x => (Vector2) x).ToArray(); var graph = new IntersectionGraph(); foreach (var points in aPolygons) graph.Goto(true, points); foreach (var points in bPolygons) graph.Goto(true, points); var polygons = graph.CalculatePolygons(true); var result = new List<m.polygon>(); for (int i = 0; i < polygons.Count; i++) { var points = polygons[i].points; var point = m.triangulation.getInsidePoint(points); var isA = aPolygons.Any(x => m.contain.nonzeroRule(x, point)); var isB = bPolygons.Any(x => m.contain.nonzeroRule(x, point)); if (predicate(isA, isB)) result.Add(polygons[i]); } return result; }
private static List<m.polygon> all(IList<m.polygon> a, IList<m.polygon> b, Func<bool, bool, bool> predicate, out List<m.line> outLines) { var aPolygons = new Vector2[a.Count][]; for (int i = 0; i < a.Count; i++) aPolygons[i] = a[i].points.Select(x => (Vector2)x).ToArray(); var bPolygons = new Vector2[b.Count][]; for (int i = 0; i < b.Count; i++) bPolygons[i] = b[i].points.Select(x => (Vector2)x).ToArray(); var graph = new IntersectionGraph(); foreach (var points in aPolygons) graph.Goto(true, points); foreach (var points in bPolygons) graph.Goto(true, points); var polygons = graph.CalculatePolygons(true); var result = new List<m.polygon>(); outLines = new List<line>(); for (int i = 0; i < polygons.Count; i++) { var polygon = polygons[i]; var dirs = ((polygon<List<IntersectionGraph.EdgeDirection>>)polygon).tag; var points = polygon.points; var point = m.triangulation.getInsidePoint(points); var isA = aPolygons.Any(x => m.contain.nonzeroRule(x, point)); var isB = bPolygons.Any(x => m.contain.nonzeroRule(x, point)); if (predicate(isA, isB)) { result.Add(polygons[i]); for (int j = 0; j < dirs.Count; j++) dirs[j].edge.conditionTouchCount++; } } for (int i = 0; i < polygons.Count; i++) { var polygon = polygons[i]; var dirs = ((polygon<List<IntersectionGraph.EdgeDirection>>)polygon).tag; for (int j = 0; j < dirs.Count; j++) { var dir = dirs[j]; if (dir.edge.conditionTouchCount == 1) outLines.Add(new line(dir.a.value, dir.b.value)); } } return result; }
public void ClientRead(ServerNetObject type, NetBuffer msg, float sendingTime) { nodes.Clear(); int nodeCount = msg.ReadByte(); Vector2[] nodePositions = new Vector2[nodeCount]; for (int i = 0; i < nodeCount; i++) { nodePositions[i] = new Vector2(msg.ReadFloat(), msg.ReadFloat()); } if (nodePositions.Any(n => !MathUtils.IsValid(n))) { return; } nodes = nodePositions.ToList(); UpdateSections(); Drawable = nodes.Any(); }
void CombineImages() { var tileResolution = (CommonConfig.HeightmapResolution - 1) * TextureConfig.PatchResolution / TextureConfig.PatchSize; var centerUtm = CommonConfig.CenterUtm.Value; // Group textures in tiles as terrain data var tilePositions = new List <Vector2Int>(); var terrainsData = Resources.LoadAll <TerrainData>(CommonConfig.TerrainDataFolder()); var terrainSize = CommonConfig.HeightmapResolution - 1; foreach (TerrainData terrainData in terrainsData) { Vector2Int posXZ = terrainData.name.GetTilePosition(CommonConfig.IdSeparator, CommonConfig.HeightmapResolution); tilePositions.Add(posXZ); } var patchRatio = TextureConfig.PatchResolution * 1.0f / TextureConfig.PatchSize; var tiles = new Dictionary <string, Dictionary <string, Vector2Int> >(); var images = Directory.GetFiles(TextureConfig.ConvertedPath, "*" + TextureConfig.ImageFormat); foreach (var image in images) { Vector2Int lonLat = image.GetUtm(); var minImageX = lonLat[0] - centerUtm[0]; var maxImageX = minImageX + TextureConfig.PatchSize - 1; var minImageZ = lonLat[1] - centerUtm[1]; var maxImageZ = minImageZ + TextureConfig.PatchSize - 1; var points = new Vector2[] { new Vector2(minImageX, minImageZ), new Vector2(maxImageX, minImageZ), new Vector2(maxImageX, maxImageZ), new Vector2(minImageX, maxImageZ), }; for (int i = 0; i < tilePositions.Count; i++) { Vector2Int tilePosition = tilePositions[i]; var minTileX = tilePosition[0]; var maxTileX = minTileX + terrainSize; var minTileZ = tilePosition[1]; var maxTileZ = minTileZ + terrainSize; var tilePoints = new Vector2[] { new Vector2(minTileX, minTileZ), new Vector2(maxTileX, minTileZ), new Vector2(maxTileX, maxTileZ), new Vector2(minTileX, maxTileZ), }; if (!points.Any(point => point.IsInside(tilePoints))) { continue; } var imagePosition = new Vector2Int(); imagePosition[0] = Convert.ToInt32((minImageX - minTileX) * patchRatio); imagePosition[1] = Convert.ToInt32(tileResolution - (maxImageZ + 1 - minTileZ) * patchRatio); var tileId = tilePosition.GetTileIdFromPosition(CommonConfig.IdSeparator, CommonConfig.HeightmapResolution); if (!tiles.ContainsKey(tileId)) { var imageAndPoints = new Dictionary <string, Vector2Int>(); imageAndPoints.Add(image, imagePosition); tiles.Add(tileId, imageAndPoints); continue; } if (!tiles[tileId].ContainsKey(image)) { tiles[tileId].Add(image, imagePosition); } } } // Combine images to tiles foreach (var tile in tiles) { var commandComposite = string.Format("convert -size {0}x{0} canvas:white ", tileResolution); foreach (var image in tile.Value) { commandComposite += string.Format("{0} -geometry {1}{2}{3}{4} -composite ", image.Key, image.Value[0] >= 0 ? "+" : "", image.Value[0], image.Value[1] >= 0 ? "+" : "", image.Value[1]); } var tileName = Path.Combine(TextureConfig.CombinedPath, tile.Key + TextureConfig.ImageFormat); commandComposite += tileName; TextureConfig.ImageMagickPath.DoMagick(commandComposite, true); } }