private void ApplyNewTile(Context context, RasterDataDetails details, ClipmapLevel level, RasterTile tile) { ClipmapLevel.Extent nextExtent = details.Type == RasterType.Terrain ? level.NextExtent : level.NextImageryExtent; RasterLevel rasterLevel = details.Type == RasterType.Terrain ? level.Terrain : level.Imagery; ClipmapUpdate entireLevel = new ClipmapUpdate( level, nextExtent.West, nextExtent.South, nextExtent.East, nextExtent.North); ClipmapUpdate thisTile = new ClipmapUpdate( level, tile.West - 1, tile.South - 1, tile.East + 1, tile.North + 1); ClipmapUpdate intersection = IntersectUpdates(entireLevel, thisTile); if (intersection.Width > 0 && intersection.Height > 0) { Update(context, intersection, level, details, rasterLevel); // Recurse on child tiles if they're NOT loaded. Unloaded children will use data from this tile. ClipmapLevel finer = level.FinerLevel; if (finer != null) { ApplyIfNotLoaded(context, details, finer, tile.SouthwestChild); ApplyIfNotLoaded(context, details, finer, tile.SoutheastChild); ApplyIfNotLoaded(context, details, finer, tile.NorthwestChild); ApplyIfNotLoaded(context, details, finer, tile.NortheastChild); } } }
private ClipmapUpdate[] SplitUpdateToAvoidWrapping(ClipmapUpdate update, RasterDataDetails details) { ClipmapLevel level = update.Level; Vector2I origin = details.Type == RasterType.Terrain ? level.OriginInTextures : level.OriginInImagery; ClipmapLevel.Extent extent = details.Type == RasterType.Terrain ? level.NextExtent : level.NextImageryExtent; int clipmapSizeX = extent.East - extent.West + 1; int clipmapSizeY = extent.North - extent.South + 1; int west = (origin.X + (update.West - extent.West)) % clipmapSizeX; int east = (origin.X + (update.East - extent.West)) % clipmapSizeX; int south = (origin.Y + (update.South - extent.South)) % clipmapSizeY; int north = (origin.Y + (update.North - extent.South)) % clipmapSizeY; if (east < west && north < south) { // Horizontal AND vertical wrap ClipmapUpdate bottomLeftUpdate = new ClipmapUpdate( level, update.West, update.South, extent.West + (clipmapSizeX - origin.X - 1), extent.South + (clipmapSizeY - origin.Y - 1)); ClipmapUpdate bottomRightUpdate = new ClipmapUpdate( level, extent.West + clipmapSizeX - origin.X, update.South, update.East, extent.South + (clipmapSizeY - origin.Y - 1)); ClipmapUpdate topLeftUpdate = new ClipmapUpdate( level, update.West, extent.South + clipmapSizeY - origin.Y, extent.West + (clipmapSizeX - origin.X - 1), update.North); ClipmapUpdate topRightUpdate = new ClipmapUpdate( level, extent.West + clipmapSizeX - origin.X, extent.South + clipmapSizeY - origin.Y, update.East, update.North); ClipmapUpdate[] result = new ClipmapUpdate[4]; result[0] = bottomLeftUpdate; result[1] = bottomRightUpdate; result[2] = topLeftUpdate; result[3] = topRightUpdate; return(result); } else if (east < west) { // Horizontal wrap ClipmapUpdate leftUpdate = new ClipmapUpdate( level, update.West, update.South, extent.West + (clipmapSizeX - origin.X - 1), update.North); ClipmapUpdate rightUpdate = new ClipmapUpdate( level, extent.West + clipmapSizeX - origin.X, update.South, update.East, update.North); ClipmapUpdate[] result = new ClipmapUpdate[2]; result[0] = leftUpdate; result[1] = rightUpdate; return(result); } else if (north < south) { // Vertical wrap ClipmapUpdate bottomUpdate = new ClipmapUpdate( level, update.West, update.South, update.East, extent.South + (clipmapSizeY - origin.Y - 1)); ClipmapUpdate topUpdate = new ClipmapUpdate( level, update.West, extent.South + clipmapSizeY - origin.Y, update.East, update.North); ClipmapUpdate[] result = new ClipmapUpdate[2]; result[0] = bottomUpdate; result[1] = topUpdate; return(result); } else { // No wrap ClipmapUpdate[] result = new ClipmapUpdate[1]; result[0] = update; return(result); } }
private void RequestTileResidency(Context context, ClipmapLevel level, RasterDataDetails details, RasterLevel rasterLevel, ClipmapLevel.Extent nextExtent) { RasterTileRegion[] tileRegions = rasterLevel.GetTilesInExtent(nextExtent.West, nextExtent.South, nextExtent.East, nextExtent.North); foreach (RasterTileRegion region in tileRegions) { if (!details.LoadedTiles.ContainsKey(region.Tile.Identifier)) { RequestTileLoad(details, level, region.Tile); } } }