forked from 1b-agent/opencadstudio-upstream
fix(save): preserve 3D view and thumbnails
Persist camera, render state, and solid fallback geometry across saves. Generate previews from a clean live viewport and refresh recent-file thumbnails immediately.
This commit is contained in:
1 parent
c4515cbbc1
commit
e94cbedaa2
15 files changed
+658
-629
No files matched your search
+40
-11
@@ -3174,6 +3174,7 @@ impl Scene {
|
||||
model_render_mode: acadrust::entities::ViewportRenderMode,
|
||||
_hover_region: Option<usize>,
|
||||
show_viewcube: bool,
|
||||
show_interaction: bool,
|
||||
viewcube_text_color: [f32; 4],
|
||||
) -> Primitive {
|
||||
let nav_build_started = iced::time::Instant::now();
|
||||
@@ -3181,7 +3182,7 @@ impl Scene {
|
||||
// Hover comes from the scene cell driven by the app-level
|
||||
// `CursorMoved` handler — the cube overlay sits above the shader
|
||||
// and would otherwise mask the move event from `Program::update`.
|
||||
let hover_region = self.viewcube_hover.get();
|
||||
let hover_region = show_interaction.then(|| self.viewcube_hover.get()).flatten();
|
||||
self.selection.borrow_mut().vp_size = (bounds.width, bounds.height);
|
||||
if bounds.height > 0.0 {
|
||||
self.set_render_aspect(bounds.width / bounds.height);
|
||||
@@ -3197,7 +3198,14 @@ impl Scene {
|
||||
.iter()
|
||||
.filter_map(|inst| {
|
||||
let force = self.refresh_consume(self.instance_id_for(inst));
|
||||
self.viewport_data_for(inst, canvas, hover_region, show_viewcube, force)
|
||||
self.viewport_data_for(
|
||||
inst,
|
||||
canvas,
|
||||
hover_region,
|
||||
show_viewcube,
|
||||
show_interaction,
|
||||
force,
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
// Empty viewports → blit nothing; the container background (model bg
|
||||
@@ -3226,9 +3234,10 @@ impl Scene {
|
||||
tile_idx: usize,
|
||||
model_render_mode: acadrust::entities::ViewportRenderMode,
|
||||
show_viewcube: bool,
|
||||
show_interaction: bool,
|
||||
viewcube_text_color: [f32; 4],
|
||||
) -> Primitive {
|
||||
let hover_region = self.viewcube_hover.get();
|
||||
let hover_region = show_interaction.then(|| self.viewcube_hover.get()).flatten();
|
||||
let canvas = (bounds.width.max(1.0), bounds.height.max(1.0));
|
||||
let bg_color = [0.0, 0.0, 0.0, 0.0];
|
||||
let tiles = self.model_tiles.borrow();
|
||||
@@ -3279,7 +3288,14 @@ impl Scene {
|
||||
};
|
||||
let force = self.refresh_consume(self.instance_id_for(&inst));
|
||||
let viewports = self
|
||||
.viewport_data_for(&inst, canvas, hover_region, show_viewcube, force)
|
||||
.viewport_data_for(
|
||||
&inst,
|
||||
canvas,
|
||||
hover_region,
|
||||
show_viewcube,
|
||||
show_interaction,
|
||||
force,
|
||||
)
|
||||
.into_iter()
|
||||
.collect();
|
||||
let perf_nav = perf_nav.map(|mut sample| {
|
||||
@@ -3304,6 +3320,7 @@ impl Scene {
|
||||
canvas: (f32, f32),
|
||||
hover_region: Option<usize>,
|
||||
show_viewcube: bool,
|
||||
show_interaction: bool,
|
||||
force_rasterize: bool,
|
||||
) -> Option<ViewportData> {
|
||||
let display = self.viewport_display_settings(inst);
|
||||
@@ -3443,7 +3460,7 @@ impl Scene {
|
||||
// paper layout, model-space overlays go to all content viewports while
|
||||
// paper-space overlays stay on the sheet. This also keeps model-space
|
||||
// coordinates out of the full-canvas sheet pass (#540).
|
||||
let show_live_overlay = if self.current_layout == "Model" {
|
||||
let show_live_overlay = show_interaction && if self.current_layout == "Model" {
|
||||
true
|
||||
} else if self.active_viewport.is_some() {
|
||||
!inst.paper_sheet
|
||||
@@ -3592,11 +3609,12 @@ impl Scene {
|
||||
// paper area. Content viewport model builders are block-filtered too;
|
||||
// the scissor only clips their already-correct Model Space set.
|
||||
let (hatches, wipeout_hatches, paper_images) = if inst.paper_sheet {
|
||||
let (hatches, wipeouts, images) = self.paper_sheet_render_models();
|
||||
let (hatches, wipeouts, images) =
|
||||
self.paper_sheet_render_models_for_view(show_interaction);
|
||||
(hatches, wipeouts, Some(images))
|
||||
} else {
|
||||
(
|
||||
self.hatch_models_for_viewport(inst.handle, &vp_frozen),
|
||||
self.hatch_models_for_viewport(inst.handle, &vp_frozen, show_interaction),
|
||||
self.wipeout_models_for_viewport(inst.handle, &vp_frozen),
|
||||
None,
|
||||
)
|
||||
@@ -3750,10 +3768,21 @@ impl Scene {
|
||||
camera_generation: self.camera_generation,
|
||||
wire_content_id,
|
||||
wire_patch,
|
||||
selected_handles: Arc::new(self.selected.iter().copied().collect()),
|
||||
hover_handles: Arc::new(self.hover_highlight_handles()),
|
||||
selection_generation: self.selection_generation,
|
||||
selected_sig: self.selected_set_sig(),
|
||||
selected_handles: Arc::new(if show_interaction {
|
||||
self.selected.iter().copied().collect()
|
||||
} else {
|
||||
rustc_hash::FxHashSet::default()
|
||||
}),
|
||||
hover_handles: Arc::new(if show_interaction {
|
||||
self.hover_highlight_handles()
|
||||
} else {
|
||||
rustc_hash::FxHashSet::default()
|
||||
}),
|
||||
selection_generation: self
|
||||
.selection_generation
|
||||
.wrapping_mul(2)
|
||||
.wrapping_add(u64::from(!show_interaction)),
|
||||
selected_sig: if show_interaction { self.selected_set_sig() } else { 0 },
|
||||
screen_rect,
|
||||
})
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user