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
|
|
@ -46,10 +46,7 @@ impl TruckConvertible for Underlay {
|
|||
if !self.clip_boundary_vertices.is_empty() {
|
||||
// Draw clip boundary polygon + close it.
|
||||
let world_verts = self.world_clip_boundary();
|
||||
let mut pts: Vec<[f64; 3]> = world_verts
|
||||
.iter()
|
||||
.map(|v| [v.x, v.y, v.z])
|
||||
.collect();
|
||||
let mut pts: Vec<[f64; 3]> = world_verts.iter().map(|v| [v.x, v.y, v.z]).collect();
|
||||
// Close polygon.
|
||||
if let Some(&first) = pts.first() {
|
||||
pts.push(first);
|
||||
|
|
@ -81,16 +78,17 @@ impl TruckConvertible for Underlay {
|
|||
|
||||
impl Grippable for Underlay {
|
||||
fn grips(&self) -> Vec<GripDef> {
|
||||
let origin = Vec3::from(v3f32(&self.insertion_point));
|
||||
let origin = glam::DVec3::new(
|
||||
self.insertion_point.x,
|
||||
self.insertion_point.y,
|
||||
self.insertion_point.z,
|
||||
);
|
||||
let mut grips = vec![square_grip(0, origin)];
|
||||
|
||||
if !self.clip_boundary_vertices.is_empty() {
|
||||
let world_verts = self.world_clip_boundary();
|
||||
for (i, v) in world_verts.iter().enumerate() {
|
||||
grips.push(center_grip(
|
||||
i + 1,
|
||||
Vec3::new(v.x as f32, v.y as f32, v.z as f32),
|
||||
));
|
||||
grips.push(center_grip(i + 1, glam::DVec3::new(v.x, v.y, v.z)));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue