forked from 1b-agent/opencadstudio-upstream
fix(tess): clamp isoline counts before they reach the kernel
Bug: $ISOLINES (header i16) and Surface.u/v_isolines (file-controlled i16) were only ever floored at 0, never capped, and were handed to the tessellation kernel as the per-face isolate count - which draws 0..count isolines per face with no ceiling of its own. SETVAR ISOLINES 32767 (or a DWG carrying that header, or a Surface with u_isolines = 32767) turned every rebuild and every per-cursor preview of PRESSPULL/REVOLVE/SWEEP/LOFT into a multi-million-vertex computation: measured 4,259,966 edge vertices for one 12-unit cylinder preview. Reproduce: 1. SETVAR ISOLINES 32767 (or open a DWG whose $ISOLINES is large, or edit a Surface whose u_isolines is 32767). 2. Draw a circle and start REVOLVE (or PRESSPULL/SWEEP/LOFT), or shade any 3D solid. 3. Before: the app allocates without bound - abort on memory failure or a permanent freeze; previews recompute on every mouse move. 4. After: previews stay interactive; a hostile header renders exactly like the largest value the Options slider can request. Fix: Cap each value at the ceiling this product already agrees on, where the type changes from i16 to the kernel count: header $ISOLINES <= 64 (the Options slider's own "Isolines per surface" range), Surface u/v_isolines <= 200 (the plugin editor's writable range). One helper (clamp_header_isolines) replaces all 11 copies of .max(0) as usize across the entity/scene/control/display feed sites, surface_isoline_counts clamps both axes, and SETVAR ISOLINES stores x.clamp(0, 64) so the echo, slider and re-saved files agree with what renders; file-sourced headers keep their raw stored value and are clamped at consumption. Clamping is density-only: geometry, bounds and saves are untouched. Three regression tests cover hostile surface counts, the SETVAR entry, and a file-sourced header measured through display tessellation (hostile renders like the slider ceiling, negative renders like zero).
This commit is contained in:
1 parent
438a46b80f
commit
e15d801011
7 files changed
+115
-13
No files matched your search
+4
-4
@@ -319,7 +319,7 @@ impl Scene {
|
||||
let facet_res = self.document.header.facet_resolution;
|
||||
let chordal_deflection =
|
||||
crate::entities::solid3d::display_deflection(&self.document.header, facet_res);
|
||||
let isolines = self.document.header.isolines.max(0) as usize;
|
||||
let isolines = crate::entities::solid3d::clamp_header_isolines(self.document.header.isolines);
|
||||
let mesh_seed = if matches!(
|
||||
&entity,
|
||||
EntityType::Solid3D(_)
|
||||
@@ -603,7 +603,7 @@ impl Scene {
|
||||
let facet_res = self.document.header.facet_resolution;
|
||||
let chordal_deflection =
|
||||
crate::entities::solid3d::display_deflection(&self.document.header, facet_res);
|
||||
let isolines = self.document.header.isolines.max(0) as usize;
|
||||
let isolines = crate::entities::solid3d::clamp_header_isolines(self.document.header.isolines);
|
||||
let mesh_seed = if matches!(
|
||||
&entity,
|
||||
EntityType::Solid3D(_)
|
||||
@@ -832,7 +832,7 @@ impl Scene {
|
||||
let facet_res = self.document.header.facet_resolution;
|
||||
let chordal_deflection =
|
||||
crate::entities::solid3d::display_deflection(&self.document.header, facet_res);
|
||||
let isolines = self.document.header.isolines.max(0) as usize;
|
||||
let isolines = crate::entities::solid3d::clamp_header_isolines(self.document.header.isolines);
|
||||
use crate::par::prelude::*;
|
||||
let built: Vec<(Handle, MeshLodSet, bool)> = entries
|
||||
.into_par_iter()
|
||||
@@ -2578,7 +2578,7 @@ impl Scene {
|
||||
let facet_res = self.document.header.facet_resolution;
|
||||
let chordal_deflection =
|
||||
crate::entities::solid3d::display_deflection(&self.document.header, facet_res);
|
||||
let isolines = self.document.header.isolines.max(0) as usize;
|
||||
let isolines = crate::entities::solid3d::clamp_header_isolines(self.document.header.isolines);
|
||||
// Top-level solids: offset into the render frame, drawn flat.
|
||||
// Block-definition solids: keep block-local coords for per-INSERT
|
||||
// instancing (no offset applied here).
|
||||
|
||||
Reference in new issue
Block a user