def export_satellite_mask(filename, cell_width, config)
heights_info = config[:heights]
heights_info.each do |height_info|
height_info[:colour] = FXRGB(*height_info[:colour])
end
mask_width = map_size / cell_width
init_gui if @window.nil?
@window.create_mask(mask_width)
FXDCWindow.new(@window.image) do |dc|
reset_progress "Exporting satellite mask (Terrain)", mask_width
(0...mask_width).each do |y|
(0...mask_width).each do |x|
height = height_at(x * cell_width, y * cell_width)
heights_info.each do |height_level|
if height <= height_level[:upto]
dc.foreground = height_level[:colour]
dc.drawPoint(x, mask_width - 1 - y)
break
end
end
end
increment_progress
end
urban_info = config[:urban]
urban_sizes = urban_info[:sizes]
urban_sizes.default = urban_info[:default_size]
dc.foreground = FXRGB(*urban_info[:colour])
urban_pattern = /#{urban_info[:pattern]}/
forest_info = config[:forest]
forest_cell_ratio = FOREST_CELL_WIDTH / cell_width
forest_grid = Array.new(map_size / FOREST_CELL_WIDTH) do
Array.new(map_size / FOREST_CELL_WIDTH, 0)
end
forest_pattern = /#{forest_info[:pattern]}/
forest_classes = forest_info[:classes]
reset_progress "Exporting satellite mask (Objects)", @objects.size / OBJECTS_PER_PROGRESS
@objects.each_with_index do |object, index|
case object.name
when urban_pattern
x_centre = object.position.x / cell_width
y_centre = object.position.y / cell_width
dir = object.dir
size = urban_sizes[object.name]
x_range = (-size[0] / 2)..(size[0] / 2)
y_range = (-size[1] / 2)..(size[1] / 2)
x_range.each do |x_model|
y_range.each do |y_model|
x_offset, y_offset = rotate(x_model / cell_width, y_model / cell_width, dir)
x = [[mask_width - 1, x_centre + x_offset].min, 0].max
y = [[mask_width - 1, y_centre + y_offset].min, 0].max
dc.drawPoint(x, mask_width - 1 - y)
forest_grid[x / forest_cell_ratio][(y / forest_cell_ratio) + 1] = -10000
end
end
when forest_pattern
if forest_classes.include? object.name
forest_grid[object.position.x / FOREST_CELL_WIDTH][object.position.y / FOREST_CELL_WIDTH] += 1
end
end
increment_progress if index.modulo(OBJECTS_PER_PROGRESS) == 0
end
reset_progress "Exporting satellite mask (Forests)", forest_grid.size
dc.foreground = FXRGB(*forest_info[:colour])
min_forest_cell_density = forest_info[:min_density] * (FOREST_CELL_WIDTH ** 2)
forest_grid.each_with_index do |row, x|
row.each_with_index do |density, y|
if density >= min_forest_cell_density
dc.fillRectangle(x * forest_cell_ratio,
(forest_grid.size - 1 - y) * forest_cell_ratio,
forest_cell_ratio,
forest_cell_ratio)
end
end
increment_progress
end
end
@window.save_mask(filename)
end