fix(scene): unfreeze open on huge xref Inserts
A real DWG with an xref containing ~74k sub-entities froze on the first render: Insert tessellation exploded the block, style-resolved every sub serially, and one bad sub could hang the loop forever. - Insert short-circuits to an insertion marker when the referenced block has more than INSERT_SUB_LIMIT (5_000) sub-entities. Documented as temporary in RENDERING_OPTIMIZATION.md. - Re-run purge_corrupt_entities after resolve_xrefs so parser-garbage inside xref content is caught (initial purge runs before xref load). - build_derived_caches: single pass over entities collecting handles per kind; tessellation reads via doc.get_entity instead of cloning every EntityType. Image decode now parallel too. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
2e985fdc9c
commit
c61d648dc7
3 changed files with 119 additions and 32 deletions
|
|
@ -272,4 +272,42 @@ Phase 4.2 Hi-Z occlusion high complexity, 3D only, last
|
|||
proportional to visible fraction.
|
||||
- **Phase 2 target:** Pan/zoom frame cost O(visible) not O(total).
|
||||
- **Phase 3 target:** Complex solid scene at far zoom → mesh triangle count < 10% of full detail.
|
||||
|
||||
---
|
||||
|
||||
## TEMPORARY: Insert sub-entity count limit (revert when better fix lands)
|
||||
|
||||
`tessellate_entity` in `src/scene/mod.rs` has a guard that short-circuits any
|
||||
Insert whose referenced block contains more than `INSERT_SUB_LIMIT` (currently
|
||||
5,000) sub-entities. The Insert is rendered as an insertion marker only — no
|
||||
explode, no sub tessellation.
|
||||
|
||||
**Why this exists:** A real-world DWG was found where an xref block contained
|
||||
~74k sub-entities. Opening the file froze the UI on the first render because
|
||||
`tessellate_entity` exploded the block and serially style-resolved every
|
||||
sub-entity (and any single bad sub could hang tessellation forever). The guard
|
||||
made the file openable.
|
||||
|
||||
**Why it should go away:** The limit hides legitimate geometry. Large xrefs are
|
||||
common in civil/infrastructure drawings — the user shouldn't have to see them
|
||||
as crosses.
|
||||
|
||||
**Proper fixes that would let us drop this guard:**
|
||||
1. Per-block tessellation cache — tessellate a block once, then per-Insert
|
||||
apply the transform to cached wire vertices. Helps when the same block is
|
||||
inserted multiple times; doesn't fully solve single-Insert huge blocks.
|
||||
2. Lazy / background Insert tessellation — show marker first, fill in detail
|
||||
on a background thread, redraw when ready.
|
||||
3. Per-sub-entity hardening — find why a single sub can hang tessellation
|
||||
(likely Spline NURBS evaluation or malformed boundary edge) and fix the
|
||||
root cause; combine with sub-count budget per frame instead of a hard cap.
|
||||
4. xref attach metadata respected — DWG carries an "unloaded" state for xref
|
||||
blocks; honour it instead of always inlining xref content on open.
|
||||
|
||||
When any of (1)–(3) lands, delete the `INSERT_SUB_LIMIT` block in
|
||||
`tessellate_entity` (search for `INSERT_SUB_LIMIT`).
|
||||
|
||||
Related companion fix in `src/app/update.rs`: after `resolve_xrefs`, a second
|
||||
`purge_corrupt_entities` pass runs against the newly inlined xref content.
|
||||
That one is not a hack — it should stay even after the Insert guard goes.
|
||||
- **Phase 4 target:** GPU-cull overhead < 0.5 ms for 1M entity scene.
|
||||
|
|
|
|||
Loading…
Reference in a new issue