fix(grips): compute grip positions in f64 so they sit on the wire
Grip markers drew visibly offset from the entity on large-coordinate (UTM-scale) drawings: every Grippable impl cast the f64 entity coordinates to f32 BEFORE the world-offset subtraction, and at 1e7 magnitude an f32 holds ~0.9 drawing units of rounding error. The wires subtract the offset in f64 first (precision-preserving), so the grips landed up to ~1 unit away from the geometry they belong to. GripDef.world is now DVec3: producers fill it straight from the f64 entity data, refresh_selected_grips subtracts the world offset in f64, and only the small offset-local result is cast to f32 for screen-space projection (grips_to_screen / find_hit_grip) and drag state. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
ed29933d87
commit
25715d1b03
33 changed files with 898 additions and 817 deletions
|
|
@ -31,7 +31,11 @@ fn shape_marker(
|
|||
oblique_angle: f64,
|
||||
) -> Vec<[f64; 3]> {
|
||||
let s = size.abs().max(0.001) * 0.5;
|
||||
let rx = s * if rel_x_scale.abs() < 1e-9 { 1.0 } else { rel_x_scale };
|
||||
let rx = s * if rel_x_scale.abs() < 1e-9 {
|
||||
1.0
|
||||
} else {
|
||||
rel_x_scale
|
||||
};
|
||||
let ry = s;
|
||||
let local = [(0.0, ry), (rx, 0.0), (0.0, -ry), (-rx, 0.0)];
|
||||
let (sin_r, cos_r) = (rotation.sin(), rotation.cos());
|
||||
|
|
@ -86,10 +90,10 @@ impl Grippable for Shape {
|
|||
fn grips(&self) -> Vec<GripDef> {
|
||||
vec![square_grip(
|
||||
0,
|
||||
Vec3::new(
|
||||
self.insertion_point.x as f32,
|
||||
self.insertion_point.y as f32,
|
||||
self.insertion_point.z as f32,
|
||||
glam::DVec3::new(
|
||||
self.insertion_point.x,
|
||||
self.insertion_point.y,
|
||||
self.insertion_point.z,
|
||||
),
|
||||
)]
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue