| 4948 | state.canvas_memo_valid = true; |
| 4949 | state.canvas_memo_mode = state.viewport_mode.clone(); |
| 4950 | state.canvas_memo_pan_x = pan_x; |
| 4951 | state.canvas_memo_pan_y = pan_y; |
| 4952 | state.canvas_memo_zoom = zoom; |
| 4953 | state.canvas_memo_layout = layout_key; |
| 4954 | state.canvas_memo_aspect = window_aspect; |
| 4955 | } |
| 4956 | ( |
| 4957 | state.viewport_mode.clone(), |
| 4958 | pan_x, |
| 4959 | pan_y, |
| 4960 | zoom, |
| 4961 | editor_layout(state), |
| 4962 | unchanged, |
| 4963 | ) |
| 4964 | }) |
| 4965 | .unwrap_or_default(); |
| 4966 | if unchanged { |
| 4967 | return; |
| 4968 | } |
| 4969 | let show = mode == "UI" || mode == "2D"; |
| 4970 | set_panel_display(ctx, "viewport_canvas_overlay", show); |
| 4971 | if !show { |
| 4972 | return; |
| 4973 | } |
| 4974 | |
| 4975 | let (canvas_w, canvas_h) = if mode == "UI" { |
| 4976 | ui_canvas_size_ratio(window_aspect, zoom, layout) |
| 4977 | } else { |
| 4978 | (1.0, 1.0) |
| 4979 | }; |
| 4980 | set_ui_center_size(ctx, "viewport_canvas_overlay", (canvas_w, canvas_h)); |
| 4981 | apply_canvas_overlay_style(ctx, &mode); |
| 4982 | apply_ui_preview_canvas_transform(ctx, &mode, zoom); |
| 4983 | |
| 4984 | let spacing = if mode == "UI" { |
| 4985 | 0.25 |
| 4986 | } else { |
| 4987 | (0.125 * zoom).clamp(0.03, 0.4) |
| 4988 | }; |
| 4989 | for i in 0..9 { |