forked from 1b-agent/opencadstudio-upstream
feat(render): relative-to-eye for the wire pipeline
The wire shader now subtracts the eye (high+low f32) per endpoint and transforms by the rotation-only view-projection instead of multiplying absolute positions by a view-projection that bakes in a large eye translation. The math is identical (proj·R·(pos−eye)) but the large eye no longer enters the f32 matrix, so lines stop jittering on pan/zoom/rotate at large (UTM) coordinates and far from world_offset. Geometry low bits are intentionally dropped: (pos − eye_high) is exact in f32 for same-magnitude operands (Sterbenz) and eye_low corrects the eye, so the only residual is a static sub-f32 position error, not motion jitter — no per-vertex low buffer needed. view_rot is cropped in lock-step with view_proj for tiled panes. Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
1 parent
8f16ba1ac2
commit
2a9416464e
2 files changed
+23
-2
No files matched your search
@@ -744,6 +744,9 @@ impl Scene {
|
||||
let mut uniforms =
|
||||
Uniforms::new(&inst.camera, full_bounds, self.document.header.lineweight_display);
|
||||
uniforms.view_proj = crop_view_proj(uniforms.view_proj, uo, vo, us, vs);
|
||||
// The RTE matrix is a view-projection too, so the same clip-space crop
|
||||
// applies — keep it in lock-step with view_proj for tiled / sub-rect panes.
|
||||
uniforms.view_rot = crop_view_proj(uniforms.view_rot, uo, vo, us, vs);
|
||||
uniforms.viewport_size = [visible_w, visible_h];
|
||||
uniforms.flat_shade = if flags.flat_shade { 1.0 } else { 0.0 };
|
||||
uniforms.transparency_enable = if self.transparency_display { 1.0 } else { 0.0 };
|
||||
|
||||
Reference in new issue
Block a user