fix(viewport): adapt entity colours to visible bg
`model_wires_for_viewport` was tessellating with `self.bg_color` (the model bg), so model content rendered inside a paper-layout viewport adapted to a dark bg even though the transparent shader now reveals the PaperCanvas sheet behind it — white wires stayed white on a light sheet. Pass the paper bg in a paper layout. Wire cache also needed an explicit invalidation when the bg or the active layout changes; otherwise the cached, already-adapted wires were returned against the new bg unchanged. - BACKGROUND command bumps `geometry_epoch` after both branches - new `Scene::set_current_layout` setter bumps on actual change; layout switch + history restore use it
This commit is contained in:
parent
2b5db8501b
commit
e3c962bdd1
4 changed files with 36 additions and 3 deletions
|
|
@ -51,6 +51,11 @@ impl OpenCADStudio {
|
||||||
self.tabs[i].bg_color = None;
|
self.tabs[i].bg_color = None;
|
||||||
self.tabs[i].scene.bg_color = [0.11, 0.11, 0.11, 1.0];
|
self.tabs[i].scene.bg_color = [0.11, 0.11, 0.11, 1.0];
|
||||||
}
|
}
|
||||||
|
// Wire colour adaptation (`adapt_to_bg`) reads the bg
|
||||||
|
// at tessellation time, so the cached wires need to
|
||||||
|
// refresh — otherwise a light→dark bg flip leaves
|
||||||
|
// black lines invisible against the new bg.
|
||||||
|
self.tabs[i].scene.bump_geometry();
|
||||||
self.command_line
|
self.command_line
|
||||||
.push_output("Background reset to default.");
|
.push_output("Background reset to default.");
|
||||||
} else if args.len() >= 3 {
|
} else if args.len() >= 3 {
|
||||||
|
|
@ -64,6 +69,7 @@ impl OpenCADStudio {
|
||||||
self.tabs[i].bg_color = Some([r, g, b, 1.0]);
|
self.tabs[i].bg_color = Some([r, g, b, 1.0]);
|
||||||
self.tabs[i].scene.bg_color = [r, g, b, 1.0];
|
self.tabs[i].scene.bg_color = [r, g, b, 1.0];
|
||||||
}
|
}
|
||||||
|
self.tabs[i].scene.bump_geometry();
|
||||||
self.command_line.push_output(&format!(
|
self.command_line.push_output(&format!(
|
||||||
"Background: rgb({}, {}, {})",
|
"Background: rgb({}, {}, {})",
|
||||||
args[0], args[1], args[2]
|
args[0], args[1], args[2]
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,11 @@ impl OpenCADStudio {
|
||||||
|
|
||||||
pub(super) fn restore_history_snapshot(&mut self, i: usize, snapshot: HistorySnapshot) {
|
pub(super) fn restore_history_snapshot(&mut self, i: usize, snapshot: HistorySnapshot) {
|
||||||
self.tabs[i].scene.document = snapshot.document;
|
self.tabs[i].scene.document = snapshot.document;
|
||||||
self.tabs[i].scene.current_layout = snapshot.current_layout;
|
self.tabs[i].scene.set_current_layout(snapshot.current_layout);
|
||||||
|
// Force a re-tessellation: the cached wires were keyed against the
|
||||||
|
// outgoing document / layout and would be returned unchanged
|
||||||
|
// otherwise (`set_current_layout` only bumps on actual change).
|
||||||
|
self.tabs[i].scene.bump_geometry();
|
||||||
self.tabs[i].scene.selected = snapshot
|
self.tabs[i].scene.selected = snapshot
|
||||||
.selected
|
.selected
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
|
|
||||||
|
|
@ -3501,7 +3501,7 @@ impl OpenCADStudio {
|
||||||
self.layout_rename_state = None;
|
self.layout_rename_state = None;
|
||||||
self.layout_context_menu = None;
|
self.layout_context_menu = None;
|
||||||
self.tabs[i].scene.active_viewport = None;
|
self.tabs[i].scene.active_viewport = None;
|
||||||
self.tabs[i].scene.current_layout = name;
|
self.tabs[i].scene.set_current_layout(name);
|
||||||
self.tabs[i].scene.deselect_all();
|
self.tabs[i].scene.deselect_all();
|
||||||
self.tabs[i].scene.restore_saved_camera();
|
self.tabs[i].scene.restore_saved_camera();
|
||||||
self.tabs[i].last_synced_camera_gen = self.tabs[i].scene.camera_generation;
|
self.tabs[i].last_synced_camera_gen = self.tabs[i].scene.camera_generation;
|
||||||
|
|
|
||||||
|
|
@ -721,6 +721,17 @@ impl Scene {
|
||||||
self.geometry_epoch = GEOMETRY_EPOCH.fetch_add(1, Ordering::Relaxed);
|
self.geometry_epoch = GEOMETRY_EPOCH.fetch_add(1, Ordering::Relaxed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Switch the active layout. Bumps `geometry_epoch` so the wire cache
|
||||||
|
/// re-tessellates — `render_style`'s `adapt_to_bg` picks the model or
|
||||||
|
/// paper background depending on `current_layout`, so cached wires
|
||||||
|
/// from the previous layout would be coloured against the wrong bg.
|
||||||
|
pub fn set_current_layout(&mut self, name: String) {
|
||||||
|
if self.current_layout != name {
|
||||||
|
self.current_layout = name;
|
||||||
|
self.bump_geometry();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns true if this viewport should display model-space content
|
/// Returns true if this viewport should display model-space content
|
||||||
/// (i.e. it is a user viewport, not the sheet/overall viewport).
|
/// (i.e. it is a user viewport, not the sheet/overall viewport).
|
||||||
///
|
///
|
||||||
|
|
@ -4839,6 +4850,18 @@ impl Scene {
|
||||||
|
|
||||||
let model_block = self.model_space_block_handle();
|
let model_block = self.model_space_block_handle();
|
||||||
let blk_cache = self.block_cache_arc();
|
let blk_cache = self.block_cache_arc();
|
||||||
|
// The visible background inside a paper-layout content viewport is
|
||||||
|
// the PaperCanvas sheet showing through the transparent shader,
|
||||||
|
// not the model bg. Adapt entity colours to the paper bg in that
|
||||||
|
// case so white wires on a light sheet turn black (and vice
|
||||||
|
// versa). In a Model layout this is unreachable in practice
|
||||||
|
// (active_viewport is a paper concept), but fall back to model bg
|
||||||
|
// just to stay consistent with the rest of the renderer.
|
||||||
|
let bg = if self.current_layout == "Model" {
|
||||||
|
self.bg_color
|
||||||
|
} else {
|
||||||
|
self.paper_bg_color
|
||||||
|
};
|
||||||
|
|
||||||
self.document
|
self.document
|
||||||
.entities()
|
.entities()
|
||||||
|
|
@ -4878,7 +4901,7 @@ impl Scene {
|
||||||
&self.selected,
|
&self.selected,
|
||||||
self.active_viewport,
|
self.active_viewport,
|
||||||
self.world_offset,
|
self.world_offset,
|
||||||
self.bg_color,
|
bg,
|
||||||
vp_anno_scale,
|
vp_anno_scale,
|
||||||
e,
|
e,
|
||||||
Some(&blk_cache),
|
Some(&blk_cache),
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue