private bool NewZonePlacementCallback(bool cancelled, Point location, object arg) { NewZoneData zoneData = (NewZoneData)arg; if (!cancelled) { // Check to see if the new zone overlaps any existing tiles for (int z = 0; z < zoneData.TilesHeight; z++) { int dz = z + gridOffset.z + location.Y; for (int x = 0; x < zoneData.TilesWidth; x++) { int dx = x + gridOffset.x + location.X; CoordXZ tileCoord = new CoordXZ(dx, dz, WorldMap.tileSize); MapTile tile = worldMap.GetTile(tileCoord); if (tile != null) { // overlaps existing tiles return(false); } } } MapZone zone = worldMap.CreateZone(zoneData.ZoneName); int samplesPerTile = WorldMap.metersPerTile / zoneData.MetersPerSample; ValueMapLayer heightFieldLayer = worldMap.HeightFieldLayer as ValueMapLayer; for (int z = 0; z < zoneData.TilesHeight; z++) { int dz = z + gridOffset.z + location.Y; for (int x = 0; x < zoneData.TilesWidth; x++) { int dx = x + gridOffset.x + location.X; CoordXZ tileCoord = new CoordXZ(dx, dz, WorldMap.tileSize); MapBuffer tileHeightmap = heightFieldLayer.CreateCompatibleMapBuffer(zoneData.Heightmap, zoneData.MetersPerSample, x * samplesPerTile, z * samplesPerTile, samplesPerTile, zoneData.MinHeight, zoneData.MaxHeight); MapTile tile = worldMap.CreateTile(tileCoord); tile.Zone = zone; if (tileHeightmap.MetersPerSample != heightFieldLayer.MetersPerSample) { tileHeightmap = tileHeightmap.Scale(worldMap.MetersPerTile / heightFieldLayer.MetersPerSample); } heightFieldLayer.CopyIn(tileCoord, tileHeightmap); ImageGridCell cell = imageGrid.CreateCell(x + location.X, z + location.Y); cell.Image = currentViewLayer.CreateThumbnail(tileCoord, worldMap.TileSize, imageGrid.CellSize); } } AddZone(zone); } return(true); }
protected void loadLayerHandler(object sender, EventArgs args) { ToolStripButton button = sender as ToolStripButton; MapZone zone = button.Tag as MapZone; using (LoadLayerDialog dlg = new LoadLayerDialog()) { DialogResult result; dlg.LayerNames = worldMap.LayerNames; result = dlg.ShowDialog(); if (result != DialogResult.OK) { return; } int tilesWidth = zone.MaxTileCoord.x - zone.MinTileCoord.x + 1; int tilesHeight = zone.MaxTileCoord.z - zone.MinTileCoord.z + 1; int zoneWidthMeters = tilesWidth * worldMap.TileSize / worldMap.OneMeter; int zoneHeightMeters = tilesHeight * worldMap.TileSize / worldMap.OneMeter; int metersPerPixel = zoneWidthMeters / dlg.LayerMapImage.Width; Debug.Assert(metersPerPixel == (zoneHeightMeters / dlg.LayerMapImage.Height)); int samplesPerTile = WorldMap.metersPerTile / metersPerPixel; MapLayer layer = worldMap.GetLayer(dlg.LayerName); for (int z = 0; z < tilesHeight; z++) { int dz = z + zone.MinTileCoord.z; for (int x = 0; x < tilesWidth; x++) { int dx = x + zone.MinTileCoord.x; CoordXZ tileCoord = new CoordXZ(dx, dz, WorldMap.tileSize); MapBuffer tileMap; if (layer is ColorMapLayer) { ColorMapLayer tmpLayer = layer as ColorMapLayer; tileMap = tmpLayer.CreateCompatibleMapBuffer(dlg.LayerMapImage, metersPerPixel, x * samplesPerTile, z * samplesPerTile, samplesPerTile); } else { ValueMapLayer tmpLayer = layer as ValueMapLayer; tileMap = null; } MapTile tile = worldMap.GetTile(tileCoord); if (tileMap.MetersPerSample != layer.MetersPerSample) { tileMap = tileMap.Scale(worldMap.MetersPerTile / layer.MetersPerSample); } layer.CopyIn(tileCoord, tileMap); } } } }