added mask export
This commit is contained in:
+73
@@ -235,6 +235,68 @@ impl TerrainApp {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn start_batch_export(&mut self) {
|
||||||
|
if self.export_in_progress {
|
||||||
|
self.status_message = String::from("Export already in progress...");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let Some(generated) = &self.generated else {
|
||||||
|
self.status_message = String::from("No generated images available to export.");
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
let folder = rfd::FileDialog::new()
|
||||||
|
.set_title("Select Export Folder")
|
||||||
|
.pick_folder();
|
||||||
|
let Some(path) = folder else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
let generated = generated.clone();
|
||||||
|
let (tx, rx) = mpsc::channel();
|
||||||
|
self.export_receiver = Some(rx);
|
||||||
|
self.export_in_progress = true;
|
||||||
|
self.status_message = format!("Exporting all layers to {}...", path.display());
|
||||||
|
|
||||||
|
thread::spawn(move || {
|
||||||
|
let result = (|| -> Result<String, String> {
|
||||||
|
let save = |img_rgba: Option<&image::RgbaImage>,
|
||||||
|
img_gray: Option<&image::GrayImage>,
|
||||||
|
name: &str| {
|
||||||
|
let full_path = path.join(format!("{}.png", name));
|
||||||
|
if let Some(img) = img_rgba {
|
||||||
|
img.save(&full_path)
|
||||||
|
} else if let Some(img) = img_gray {
|
||||||
|
img.save(&full_path)
|
||||||
|
} else {
|
||||||
|
return Err(format!("No image data for {}", name));
|
||||||
|
}
|
||||||
|
.map_err(|e| format!("Failed to save {}: {}", name, e))
|
||||||
|
};
|
||||||
|
|
||||||
|
save(
|
||||||
|
Some(&generated.terrain_composite_image),
|
||||||
|
None,
|
||||||
|
"terrain_composite",
|
||||||
|
)?;
|
||||||
|
save(Some(&generated.terrain_color_image), None, "terrain_color")?;
|
||||||
|
save(None, Some(&generated.heightmap_image), "heightmap")?;
|
||||||
|
save(None, Some(&generated.bumpmap_image), "bumpmap")?;
|
||||||
|
save(None, Some(&generated.grass_mask_image), "mask_grass")?;
|
||||||
|
save(None, Some(&generated.water_mask_image), "mask_water")?;
|
||||||
|
save(None, Some(&generated.rock_mask_image), "mask_rock")?;
|
||||||
|
save(None, Some(&generated.snow_mask_image), "mask_snow")?;
|
||||||
|
|
||||||
|
Ok(format!(
|
||||||
|
"Successfully exported 8 layers to {}.",
|
||||||
|
path.display()
|
||||||
|
))
|
||||||
|
})();
|
||||||
|
let _ = tx.send(result);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
fn install_textures(&mut self, ctx: &Context, images: &GeneratedImages) {
|
fn install_textures(&mut self, ctx: &Context, images: &GeneratedImages) {
|
||||||
let heightmap = gray_to_color_image(&images.heightmap_image);
|
let heightmap = gray_to_color_image(&images.heightmap_image);
|
||||||
let bumpmap = gray_to_color_image(&images.bumpmap_image);
|
let bumpmap = gray_to_color_image(&images.bumpmap_image);
|
||||||
@@ -428,6 +490,17 @@ impl TerrainApp {
|
|||||||
self.start_generation();
|
self.start_generation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ui.add_space(8.0);
|
||||||
|
if ui
|
||||||
|
.add_sized(
|
||||||
|
[ui.available_width(), 32.0],
|
||||||
|
egui::Button::new("Export All Layers"),
|
||||||
|
)
|
||||||
|
.clicked()
|
||||||
|
{
|
||||||
|
self.start_batch_export();
|
||||||
|
}
|
||||||
|
|
||||||
if self.generation_in_progress {
|
if self.generation_in_progress {
|
||||||
ui.add_space(8.0);
|
ui.add_space(8.0);
|
||||||
ui.spinner();
|
ui.spinner();
|
||||||
|
|||||||
Reference in New Issue
Block a user