feat(scene): scale Solid3D / Region / Body tessellation by header FACETRES
ACIS-bearing entities tessellated with a hard-coded LOD ladder (circ_segs / grid_u / grid_v) so a high-detail drawing produced the same coarse mesh as a low-detail one. Multiply the per-LOD counts by `header.facet_resolution` (FACETRES), clamped to AutoCAD's documented [0.01, 10.0] range with a floor of 4 segments to keep degenerate values harmless. All four call sites (build_caches, commit_entity mesh seed, undo/redo populate_meshes_from_document, and the helper signatures themselves) take a FACETRES argument now. ISOLINES / surface_u_density / surface_v_density and the camera / sun / geo header fields stay metadata until matching render work lands. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
0db21568c1
commit
9c4043ef45
2 changed files with 39 additions and 17 deletions
|
|
@ -203,16 +203,19 @@ pub fn build_derived_caches(doc: &CadDocument) -> DerivedCaches {
|
|||
})
|
||||
.collect();
|
||||
|
||||
// meshes (parallel tessellation)
|
||||
// meshes (parallel tessellation). FACETRES (header.facet_resolution)
|
||||
// scales the per-LOD segment counts so users with finer drawings get
|
||||
// smoother solids; clamped to AutoCAD's [0.01, 10.0] range inside.
|
||||
let facet_res = doc.header.facet_resolution;
|
||||
let meshes: HashMap<Handle, MeshLodSet> = mesh_handles
|
||||
.par_iter()
|
||||
.filter_map(|&handle| {
|
||||
let e = doc.get_entity(handle)?;
|
||||
let color = tessellate::aci_to_rgba(&e.common().color);
|
||||
let model = match e {
|
||||
EntityType::Solid3D(s) => solid3d_tess::tessellate_solid3d(s, color),
|
||||
EntityType::Region(r) => solid3d_tess::tessellate_region(r, color),
|
||||
EntityType::Body(b) => solid3d_tess::tessellate_body(b, color),
|
||||
EntityType::Solid3D(s) => solid3d_tess::tessellate_solid3d(s, color, facet_res),
|
||||
EntityType::Region(r) => solid3d_tess::tessellate_region(r, color, facet_res),
|
||||
EntityType::Body(b) => solid3d_tess::tessellate_body(b, color, facet_res),
|
||||
_ => None,
|
||||
};
|
||||
model.map(|m| (handle, m))
|
||||
|
|
@ -2372,18 +2375,19 @@ impl Scene {
|
|||
} else {
|
||||
None
|
||||
};
|
||||
let facet_res = self.document.header.facet_resolution;
|
||||
let mesh_seed = match &entity {
|
||||
EntityType::Solid3D(s3d) => {
|
||||
let color = self.render_style(&entity).0;
|
||||
solid3d_tess::tessellate_solid3d(s3d, color)
|
||||
solid3d_tess::tessellate_solid3d(s3d, color, facet_res)
|
||||
}
|
||||
EntityType::Region(r) => {
|
||||
let color = self.render_style(&entity).0;
|
||||
solid3d_tess::tessellate_region(r, color)
|
||||
solid3d_tess::tessellate_region(r, color, facet_res)
|
||||
}
|
||||
EntityType::Body(b) => {
|
||||
let color = self.render_style(&entity).0;
|
||||
solid3d_tess::tessellate_body(b, color)
|
||||
solid3d_tess::tessellate_body(b, color, facet_res)
|
||||
}
|
||||
_ => None,
|
||||
};
|
||||
|
|
@ -3216,13 +3220,16 @@ impl Scene {
|
|||
.collect();
|
||||
|
||||
use rayon::prelude::*;
|
||||
let facet_res = self.document.header.facet_resolution;
|
||||
self.meshes = entries
|
||||
.into_par_iter()
|
||||
.filter_map(|(handle, entity, color)| {
|
||||
let model = match &entity {
|
||||
EntityType::Solid3D(s) => solid3d_tess::tessellate_solid3d(s, color),
|
||||
EntityType::Region(r) => solid3d_tess::tessellate_region(r, color),
|
||||
EntityType::Body(b) => solid3d_tess::tessellate_body(b, color),
|
||||
EntityType::Solid3D(s) => {
|
||||
solid3d_tess::tessellate_solid3d(s, color, facet_res)
|
||||
}
|
||||
EntityType::Region(r) => solid3d_tess::tessellate_region(r, color, facet_res),
|
||||
EntityType::Body(b) => solid3d_tess::tessellate_body(b, color, facet_res),
|
||||
_ => None,
|
||||
};
|
||||
model.map(|m| (handle, m))
|
||||
|
|
|
|||
Loading…
Reference in a new issue