Beispiel #1
0
        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();
        }
Beispiel #2
0
        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;
        }
Beispiel #3
0
        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;
        }
Beispiel #4
0
        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);
            }
        }