paper_canvas_wires() now returns Arc<Vec<WireModel>> backed by
paper_canvas_cache (epoch-keyed). Pan/zoom frames hit the cache and
return a pointer copy; only geometry changes rebuild the wire list.
Completes the paper-canvas caching chain (L+M): sheet cache →
projected-per-viewport cache → full canvas Arc cache.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Option I: add per-viewport Arc wire cache so paper-space viewport rendering
no longer re-tessellates model content every frame.
Option J: hit_test_wires() returns Arc<Vec<WireModel>> — O(1) pointer copy
in model space instead of a full Vec clone on every mouse move during commands.
paper_canvas_hatches/wipeouts() now route through the epoch caches added in F.
Option K: add world_snap_r + wire_in_range() pre-check to Snapper::snap().
All Endpoint/Midpoint/Nearest/Perpendicular/Intersection loops skip wires
whose chord sphere is outside the snap circle using O(1) scalar comparisons,
eliminating O(entities × vertices) matrix multiply cost when zoomed in.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
White paper fill was calculated from entity bounding boxes (paper_entity_extents),
so adding a viewport caused the paper to visually shrink to the viewport's bounds.
Now paper_limits() (layout min/max limits) is used directly, and the unused
paper_entity_extents() function is removed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- paper_entity_extents() computes the bounding box of actual DXF entities
so the white fill always matches the drawn title-block / frame borders,
regardless of whether Layout min/max_limits match entity positions
- Falls back to paper_limits() (→ A4 297×210) when layout has no entities
- Removed paper_boundary_wire: the white fill now acts as the visual paper
edge so the near-white wire (invisible on white) was redundant
- LayoutCreate sets limits to A4 landscape immediately after add_layout()
to override acadrust's imperial default (12×9)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- paper_limits() falls back to A4 landscape (297×210mm) even when no
Layout object exists in the document
- paper_bg_color default changed to white [1,1,1,1] (paper surface color)
- PaperCanvas::draw() fills canvas with dark desk color first, then draws
the paper area rectangle in paper_bg_color so the sheet is clearly
visible against the desk background
- view.rs container background uses the fixed desk color instead of
paper_bg_color so it no longer conflicts with the paper-surface color
- BACKGROUND RESET for paper space now resets to white instead of dark gray
- Removed unused PaperSheet variant, paper_sheet() constructor,
build_paper_sheet_primitive() and associated match arms (dead code
after 2D canvas replacement)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Paper space is now rendered as a 2D vector canvas (iced::widget::canvas)
instead of a 3D shader widget. This allows direct interaction with
paper-space entities (title blocks, viewport borders, annotations)
without needing to enter MSPACE first.
Changes:
- src/scene/paper_canvas.rs: new PaperCanvas<'a> canvas::Program that
renders paper wires (with linetype dashes), solid/gradient hatch fills,
and wipeout backgrounds using the paper camera's orthographic transform.
- Scene: three new public helpers (paper_canvas_wires, paper_canvas_hatches,
paper_canvas_wipeouts) feed the canvas with the same data the old shader
used, including inactive viewport projections and interim/preview wires.
- view.rs: paper_canvas_view() now wraps PaperCanvas instead of
shader(ViewportPane::paper_sheet(…)). The PaperViewportPane 3D shader
overlay for the active MSPACE viewport is unchanged.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>