From 8c951740367d5a236bfa4115017155da9257cf49 Mon Sep 17 00:00:00 2001 From: core Date: Thu, 10 Jul 2025 09:34:13 -0400 Subject: [PATCH] fix: attachment joint child entities causing `GlobalTransform` to be reset after a frame --- crates/unified/src/client/key_input.rs | 26 ++++++++++++++------------ crates/unified/src/server/part.rs | 4 ---- crates/unified/src/shared_plugins.rs | 5 +++-- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/crates/unified/src/client/key_input.rs b/crates/unified/src/client/key_input.rs index 07baa977ce5972004de5674786af4a411b942019..141b5b187a9421db70007e8417e6e855947a4f4b 100644 --- a/crates/unified/src/client/key_input.rs +++ b/crates/unified/src/client/key_input.rs @@ -1,12 +1,9 @@ -use crate::attachment::{Joint, SnapOfJoint}; -use crate::ecs::ThrustEvent; +use crate::attachment::{Joint, JointOf, SnapOf, SnapOfJoint}; +use crate::ecs::{Part, ThrustEvent}; use bevy::color::palettes::css::{FUCHSIA, GREEN}; use bevy::dev_tools::picking_debug::DebugPickingMode; use bevy::math::Vec3Swizzles; -use bevy::prelude::{ - Gizmos, GlobalTransform, Query, - ResMut, Resource, With, -}; +use bevy::prelude::{Gizmos, GlobalTransform, Query, ResMut, Resource, Transform, With}; use bevy::{ app::{App, Update}, ecs::{event::EventWriter, system::Res}, @@ -69,18 +66,23 @@ fn directional_keys(keys: Res>, mut thrust_event: EventWrit } fn draw_attachment_debug( - joints: Query<&GlobalTransform, With>, - snaps: Query<&GlobalTransform, With>, + joints: Query<(&Transform, &JointOf)>, + snaps: Query<(&Transform, &SnapOf)>, + parts: Query<&GlobalTransform, With>, mut gizmos: Gizmos, state: ResMut, ) { if !state.0 { return; } - for joint_target in joints.iter() { - gizmos.cross_2d(joint_target.translation().xy(), 4.0, FUCHSIA); + for (offset, parent) in joints.iter() { + let Ok(parent_pos) = parts.get(parent.0) else { continue; }; + let joint_target = parent_pos.transform_point(offset.translation); + gizmos.cross_2d(joint_target.xy(), 4.0, FUCHSIA); } - for joint_snap in snaps.iter() { - gizmos.cross_2d(joint_snap.translation().xy(), 4.0, GREEN); + for (offset, parent) in snaps.iter() { + let Ok(parent_pos) = parts.get(parent.0) else { continue; }; + let joint_snap = parent_pos.transform_point(offset.translation); + gizmos.cross_2d(joint_snap.xy(), 4.0, GREEN); } } diff --git a/crates/unified/src/server/part.rs b/crates/unified/src/server/part.rs index ac9264fa118c1e35bca89692d05001be64535763..78dd4995590d920fac4ac435c6364ebaf149807f 100644 --- a/crates/unified/src/server/part.rs +++ b/crates/unified/src/server/part.rs @@ -72,13 +72,11 @@ fn spawn_joint_bundle(joint: &JointConfig, part: &PartConfig, parent: &Entity) - }; let joint_transform: Transform = j_comp.transform; let joint_of = JointOf(*parent); - let child_of = ChildOf(*parent); ( j_comp, joint_transform, joint_of, - child_of, Replicated ) } @@ -86,13 +84,11 @@ fn spawn_snap_bundle(joint: &JointConfig, parent: &Entity, p_joint: &Entity) -> let snap_transform: Transform = joint.snap.into(); let snap_for = SnapOf(*parent); let snap_of = SnapOfJoint(*p_joint); - let child_of = ChildOf(*parent); ( snap_transform, snap_for, snap_of, - child_of, Replicated ) } diff --git a/crates/unified/src/shared_plugins.rs b/crates/unified/src/shared_plugins.rs index 0ee4f33a09b89d955ab0564eb36c743162930cd4..387bf9504dea5cf81146c2ef29e0af6d0037ab02 100644 --- a/crates/unified/src/shared_plugins.rs +++ b/crates/unified/src/shared_plugins.rs @@ -1,4 +1,4 @@ -use crate::attachment::{Joint, JointOf, SnapOfJoint, PartInShip, Peer, Ship}; +use crate::attachment::{Joint, JointOf, SnapOfJoint, PartInShip, Peer, Ship, SnapOf}; use crate::config::planet::Planet; use crate::ecs::{DragRequestEvent, Part, Particles, Player, ThrustEvent}; use bevy::app::{App, PluginGroup, PluginGroupBuilder}; @@ -34,7 +34,8 @@ pub fn register_everything(app: &mut App) { .replicate::() .replicate::() .replicate::() - .replicate::(); + .replicate::() + .replicate::(); } fn physics_setup_plugin(app: &mut App) {