From bbe524c39a1b30788a6369dc8cd590082025f5d5 Mon Sep 17 00:00:00 2001 From: grimsace Date: Thu, 21 May 2026 11:08:11 -0500 Subject: [PATCH] fixed export for internal rooms --- src/exporter/pipeline.rs | 19 +++---- src/exporter/raster.rs | 108 +++++++++++++++++++++++++++++++++++---- src/exporter/svg.rs | 92 ++++++++++++++++++++++++++++++--- 3 files changed, 193 insertions(+), 26 deletions(-) diff --git a/src/exporter/pipeline.rs b/src/exporter/pipeline.rs index 1051bab..5f13fdc 100644 --- a/src/exporter/pipeline.rs +++ b/src/exporter/pipeline.rs @@ -321,15 +321,16 @@ fn render_mask_pixmap( context.wall_width, WHITE, ); - raster::draw_cell_walls( - &mut pixmap, - g, - &scene.room_cells, - Some(&scene.room_edges), - &scene.door_edges, - context.wall_width, - WHITE, - ); + for room in &layout.rooms { + raster::draw_room_walls( + &mut pixmap, + g, + room, + &scene.door_edges, + context.wall_width, + WHITE, + ); + } ("walls_mask", pixmap) } MaskTask::Doors => { diff --git a/src/exporter/raster.rs b/src/exporter/raster.rs index e4a7d94..54bcb03 100644 --- a/src/exporter/raster.rs +++ b/src/exporter/raster.rs @@ -65,15 +65,10 @@ pub fn render_pixmap_with_scene( wall_w, BLACK, ); - draw_cell_walls( - &mut pixmap, - g, - &scene.room_cells, - Some(&scene.room_edges), - &scene.door_edges, - wall_w, - BLACK, - ); + + for room in &layout.rooms { + draw_room_walls(&mut pixmap, g, room, &scene.door_edges, wall_w, BLACK); + } for door in &layout.doors { let (color, style) = if settings.colorblind_mode { @@ -543,6 +538,101 @@ pub fn draw_room_crosshatch( } } +// Draws room walls. +pub fn draw_room_walls( + pixmap: &mut Pixmap, + g: &ExportGeometry, + room: &Room, + door_edges: &HashSet, + width: f32, + color: (u8, u8, u8, u8), +) { + for rx in 0..room.width { + for ry in 0..room.height { + let col = room.x + rx; + let row = room.y + ry; + let left = (col, row); + let right = (col + 1, row); + let top = (col, row); + let bottom = (col, row + 1); + + if rx == 0 { + let neighbor = col.checked_sub(1).map(|x| (x, row)); + let suppressed = neighbor + .map(|n| door_edges.contains(&norm_edge(left, n))) + .unwrap_or(false); + if !suppressed { + if let Some(rect) = g.cell_rect(col, row) { + draw_wall_segment( + pixmap, + rect.left(), + rect.top(), + rect.left(), + rect.bottom(), + width, + color, + ); + } + } + } + + if rx == room.width - 1 { + let suppressed = door_edges.contains(&norm_edge(left, right)); + if !suppressed { + if let Some(rect) = g.cell_rect(col, row) { + draw_wall_segment( + pixmap, + rect.right(), + rect.top(), + rect.right(), + rect.bottom(), + width, + color, + ); + } + } + } + + if ry == 0 { + let neighbor = row.checked_sub(1).map(|y| (col, y)); + let suppressed = neighbor + .map(|n| door_edges.contains(&norm_edge(top, n))) + .unwrap_or(false); + if !suppressed { + if let Some(rect) = g.cell_rect(col, row) { + draw_wall_segment( + pixmap, + rect.left(), + rect.top(), + rect.right(), + rect.top(), + width, + color, + ); + } + } + } + + if ry == room.height - 1 { + let suppressed = door_edges.contains(&norm_edge(top, bottom)); + if !suppressed { + if let Some(rect) = g.cell_rect(col, row) { + draw_wall_segment( + pixmap, + rect.left(), + rect.bottom(), + rect.right(), + rect.bottom(), + width, + color, + ); + } + } + } + } + } +} + // Draws cell walls. pub fn draw_cell_walls( pixmap: &mut Pixmap, diff --git a/src/exporter/svg.rs b/src/exporter/svg.rs index 5d927c2..6e0f200 100644 --- a/src/exporter/svg.rs +++ b/src/exporter/svg.rs @@ -122,14 +122,10 @@ pub fn build_svg(layout: &DungeonLayout, settings: &UiSettings) -> String { &scene.door_edges, wall_w, ); - append_svg_walls( - &mut s, - &g, - &scene.room_cells, - Some(&scene.room_edges), - &scene.door_edges, - wall_w, - ); + + for room in &layout.rooms { + append_svg_room_walls(&mut s, &g, room, &scene.door_edges, wall_w); + } for door in &layout.doors { let (color, dash) = if settings.colorblind_mode { @@ -254,6 +250,86 @@ pub fn build_svg(layout: &DungeonLayout, settings: &UiSettings) -> String { s } +// Appends svg room walls. +pub fn append_svg_room_walls( + out: &mut String, + g: &ExportGeometry, + room: &crate::layout::Room, + door_edges: &HashSet, + width: f32, +) { + for rx in 0..room.width { + for ry in 0..room.height { + let col = room.x + rx; + let row = room.y + ry; + let left = g.left() + col as f32 * g.cell; + let top = g.top() + row as f32 * g.cell; + let right = left + g.cell; + let bottom = top + g.cell; + + if rx == 0 { + let neighbor = col.checked_sub(1).map(|x| (x, row)); + let suppressed = neighbor + .map(|n| door_edges.contains(&norm_edge((col, row), n))) + .unwrap_or(false); + if !suppressed { + let _ = writeln!( + out, + "", + left - (width * 0.5), + top - (width * 0.5), + (bottom - top) + width + ); + } + } + + if rx == room.width - 1 { + let neighbor = (col + 1, row); + let suppressed = door_edges.contains(&norm_edge((col, row), neighbor)); + if !suppressed { + let _ = writeln!( + out, + "", + right - (width * 0.5), + top - (width * 0.5), + (bottom - top) + width + ); + } + } + + if ry == 0 { + let neighbor = row.checked_sub(1).map(|y| (col, y)); + let suppressed = neighbor + .map(|n| door_edges.contains(&norm_edge((col, row), n))) + .unwrap_or(false); + if !suppressed { + let _ = writeln!( + out, + "", + left - (width * 0.5), + top - (width * 0.5), + (right - left) + width + ); + } + } + + if ry == room.height - 1 { + let neighbor = (col, row + 1); + let suppressed = door_edges.contains(&norm_edge((col, row), neighbor)); + if !suppressed { + let _ = writeln!( + out, + "", + left - (width * 0.5), + bottom - (width * 0.5), + (right - left) + width + ); + } + } + } + } +} + // Appends svg walls. pub fn append_svg_walls( out: &mut String,