M crates/unified/assets/config/parts/chassis.part.toml => crates/unified/assets/config/parts/chassis.part.toml +4 -4
@@ 10,21 10,21 @@ mass = 100
[[joints]]
id = "Top"
-target = { translation = [ 0.0, 50.0, 0.0 ], rotation = 180.0 }
+target = { translation = [ 0.0, 50.0, 0.0 ], rotation = 0.0 }
snap = { translation = [ 0.0, 25.0, 0.0 ], rotation = 0.0 }
[[joints]]
id = "Right"
-target = { translation = [ 50.0, 0.0, 0.0 ], rotation = 270.0 }
+target = { translation = [ 50.0, 0.0, 0.0 ], rotation = -90.0 }
snap = { translation = [ 25.0, 0.0, 0.0 ], rotation = 0.0 }
[[joints]]
id = "Bottom"
-target = { translation = [ 0.0, -50.0, 0.0 ], rotation = 0.0 }
+target = { translation = [ 0.0, -50.0, 0.0 ], rotation = -180.0 }
snap = { translation = [ 0.0, -25.0, 0.0 ], rotation = 0.0 }
[[joints]]
id = "Left"
-target = { translation = [ -50.0, 0.0, 0.0 ], rotation = 90.0 }
+target = { translation = [ -50.0, 0.0, 0.0 ], rotation = -270.0 }
snap = { translation = [ -25.0, 0.0, 0.0 ], rotation = 0.0 }=
\ No newline at end of file
M crates/unified/assets/config/parts/hearty.part.toml => crates/unified/assets/config/parts/hearty.part.toml +4 -4
@@ 14,21 14,21 @@ exhaust_speed = 250
[[joints]]
id = "Top"
-target = { translation = [ 0.0, 50.0, 0.0 ], rotation = 180.0 }
+target = { translation = [ 0.0, 50.0, 0.0 ], rotation = 0.0 }
snap = { translation = [ 0.0, 25.0, 0.0 ], rotation = 0.0 }
[[joints]]
id = "Right"
-target = { translation = [ 50.0, 0.0, 0.0 ], rotation = 270.0 }
+target = { translation = [ 50.0, 0.0, 0.0 ], rotation = -90.0 }
snap = { translation = [ 25.0, 0.0, 0.0 ], rotation = 0.0 }
[[joints]]
id = "Bottom"
-target = { translation = [ 0.0, -50.0, 0.0 ], rotation = 0.0 }
+target = { translation = [ 0.0, -50.0, 0.0 ], rotation = -180.0 }
snap = { translation = [ 0.0, -25.0, 0.0 ], rotation = 0.0 }
[[joints]]
id = "Left"
-target = { translation = [ -50.0, 0.0, 0.0 ], rotation = 90.0 }
+target = { translation = [ -50.0, 0.0, 0.0 ], rotation = -270.0 }
snap = { translation = [ -25.0, 0.0, 0.0 ], rotation = 0.0 }=
\ No newline at end of file
M crates/unified/src/client/parts.rs => crates/unified/src/client/parts.rs +11 -12
@@ 186,7 186,7 @@ fn update_drag_ghosts(
// only snap to ourselves
- let Ok((parent_position, maybe_me, maybe_parent_ship)) = parts.get(snap_part.0) else {
+ let Ok((part_being_snapped_to, maybe_me, maybe_parent_ship)) = parts.get(snap_part.0) else {
continue;
};
@@ 195,7 195,7 @@ fn update_drag_ghosts(
continue;
}
- let snap_global_translation = parent_position
+ let snap_global_translation = part_being_snapped_to
.mul_transform(*snap_local_transform);
let distance_to_cursor = cursor.distance(snap_global_translation.translation().xy());
@@ 221,21 221,20 @@ fn update_drag_ghosts(
continue;
};
- let joint_target = parent_position.transform_point(offset.translation);
+ let joint_target = part_being_snapped_to.transform_point(offset.translation);
if debug.0 {
gizmos.circle_2d(joint_target.xy(), 3.0, GREEN);
}
snap = Some(snap_id);
- let target_transform = Transform {
+ let mut target_transform = Transform {
translation: joint_target,
rotation: ghost.rotation,
scale: offset.scale,
};
best_distance = distance_to_cursor;
- best_target = target_transform;
- best_parent_position = Some(parent_position.translation().xy());
+ best_parent_position = Some(part_being_snapped_to.translation().xy());
best_snap_position = Some(snap_global_translation);
// find, in this particular situation, the best peer on ourselves
@@ 246,7 245,7 @@ fn update_drag_ghosts(
let mut best_joint_transform = None;
for (our_snap_local_transform, our_snap_joint, our_snap_part, our_snap_id) in &snaps {
if Some(our_snap_part.0) != drag.0 { continue; }
- let our_snap_global_translation = best_target
+ let our_snap_global_translation = target_transform
.mul_transform(*our_snap_local_transform);
let distance = our_snap_global_translation.translation.distance(snap_global_translation.translation());
if distance > best_peer_snap_distance { continue; }
@@ 256,18 255,18 @@ fn update_drag_ghosts(
best_peer_snap = Some(our_snap_id);
best_peer_snap_distance = distance;
best_peer_snap_pos = Some(our_snap_global_translation.translation.xy());
- best_peer_target_pos = Some(best_target.translation.xy());
+ best_peer_target_pos = Some(target_transform.translation.xy());
best_joint_transform = Some(our_joint);
}
- if let Some(our_joint) = best_joint_transform {
- best_target.rotation = parent_position.rotation().mul_quat(our_joint.rotation);
- }
-
+ target_transform.rotation = part_being_snapped_to.rotation() * (offset.rotation * best_joint_transform.unwrap().rotation.inverse()) * Quat::from_rotation_z(180.0f32.to_radians());
+ best_target = target_transform;
best_self_snap = best_peer_snap;
best_self_snap_position = best_peer_snap_pos;
best_self_position = best_peer_target_pos;
}
+
+
if debug.0 && let Some(part) = best_parent_position && let Some(snap) = best_snap_position {
gizmos.arrow_2d(part, snap.translation().xy(), YELLOW);
}