From 04beb9f36db6a39a3be1263a79cdf80af900dbe0 Mon Sep 17 00:00:00 2001 From: core Date: Tue, 8 Jul 2025 22:59:08 -0400 Subject: [PATCH] fix: anchors --- crates/unified/src/attachment.rs | 10 +++--- crates/unified/src/client/key_input.rs | 5 +-- crates/unified/src/server/part.rs | 44 +++++++++++++++++++++++++- crates/unified/src/shared_plugins.rs | 4 +-- 4 files changed, 53 insertions(+), 10 deletions(-) diff --git a/crates/unified/src/attachment.rs b/crates/unified/src/attachment.rs index 93307bbb4f03e37669c5b059e04a1d8c30ae5304..fb8026c61147e256c64f1f3f51efc954685b9b53 100644 --- a/crates/unified/src/attachment.rs +++ b/crates/unified/src/attachment.rs @@ -30,11 +30,11 @@ pub struct JointOf(#[entities] pub Entity); #[relationship_target(relationship = JointOf)] pub struct Joints(#[entities] Vec); #[derive(Component, Serialize, Deserialize, MapEntities)] -#[relationship(relationship_target = JointSnaps)] -pub struct JointSnapOf(#[entities] pub Entity); +#[relationship(relationship_target = Snaps)] +pub struct SnapOf(#[entities] pub Entity); #[derive(Component, Serialize, Deserialize, MapEntities)] -#[relationship_target(relationship = JointSnapOf)] -pub struct JointSnaps(#[entities] Vec); +#[relationship_target(relationship = SnapOf)] +pub struct Snaps(#[entities] Vec); #[derive(Serialize, Deserialize)] pub struct JointId(pub String); @@ -45,4 +45,4 @@ impl JointId { } #[derive(Serialize, Deserialize, Component, MapEntities)] -pub struct JointSnapFor(#[entities] pub Entity); +pub struct SnapOfJoint(#[entities] pub Entity); diff --git a/crates/unified/src/client/key_input.rs b/crates/unified/src/client/key_input.rs index 8a866911af75108de5c39b4054d7b8e0aee4dd6b..07baa977ce5972004de5674786af4a411b942019 100644 --- a/crates/unified/src/client/key_input.rs +++ b/crates/unified/src/client/key_input.rs @@ -1,4 +1,4 @@ -use crate::attachment::{Joint, JointSnapFor}; +use crate::attachment::{Joint, SnapOfJoint}; use crate::ecs::ThrustEvent; use bevy::color::palettes::css::{FUCHSIA, GREEN}; use bevy::dev_tools::picking_debug::DebugPickingMode; @@ -12,6 +12,7 @@ use bevy::{ ecs::{event::EventWriter, system::Res}, input::{ButtonInput, keyboard::KeyCode}, }; +use bevy::log::debug; use bevy_rapier2d::render::DebugRenderContext; pub fn key_input_plugin(app: &mut App) { @@ -69,7 +70,7 @@ fn directional_keys(keys: Res>, mut thrust_event: EventWrit fn draw_attachment_debug( joints: Query<&GlobalTransform, With>, - snaps: Query<&GlobalTransform, With>, + snaps: Query<&GlobalTransform, With>, mut gizmos: Gizmos, state: ResMut, ) { diff --git a/crates/unified/src/server/part.rs b/crates/unified/src/server/part.rs index 86dd205c2749cc0c75bb33971fed5b6104e905b3..5e4d83fb06d5a8fe51e0f806ba318e8636a0c2b1 100644 --- a/crates/unified/src/server/part.rs +++ b/crates/unified/src/server/part.rs @@ -1,7 +1,10 @@ +use bevy::ecs::spawn::SpawnRelatedBundle; use bevy::prelude::Component; use bevy::prelude::*; use bevy_rapier2d::prelude::{AdditionalMassProperties, Collider}; -use crate::config::part::PartConfig; +use bevy_replicon::prelude::Replicated; +use crate::attachment::{Joint, JointId, JointOf, SnapOf, SnapOfJoint}; +use crate::config::part::{JointConfig, PartConfig}; use crate::ecs::{Part, PartHandle}; pub fn part_management_plugin(app: &mut App) { @@ -25,6 +28,7 @@ pub fn handle_ready_parts(loading_parts: Query<(Entity, &SpawnPartRequest)>, mut commands.entity(entity) .insert(calculate_bundle(strong_config, &loading_part.0)) .remove::(); + spawn_joints(strong_config, entity, commands.reborrow()); } } } @@ -42,5 +46,43 @@ fn calculate_bundle(config: &PartConfig, handle: &Handle) -> impl Bu part_handle, collider, additional_mass_properties, + Replicated ) +} +fn spawn_joint_bundle(joint: &JointConfig, part: &PartConfig, parent: &Entity) -> impl Bundle { + let j_comp = Joint { + id: JointId::from_part_and_joint_id(part.part.name.clone(), joint.id.clone()), + transform: joint.target.into(), + }; + 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 + ) +} +fn spawn_snap_bundle(joint: &JointConfig, parent: &Entity, p_joint: &Entity) -> impl Bundle { + 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 + ) +} +fn spawn_joints(config: &PartConfig, parent: Entity, mut commands: Commands) { + for joint in &config.joints { + let joint_id = commands.spawn(spawn_joint_bundle(joint, config, &parent)).id(); + commands.spawn(spawn_snap_bundle(joint, &parent, &joint_id)); + } } \ No newline at end of file diff --git a/crates/unified/src/shared_plugins.rs b/crates/unified/src/shared_plugins.rs index f6b7a0b38e4ae1fc3a428c16723f01dba0c49599..0ee4f33a09b89d955ab0564eb36c743162930cd4 100644 --- a/crates/unified/src/shared_plugins.rs +++ b/crates/unified/src/shared_plugins.rs @@ -1,4 +1,4 @@ -use crate::attachment::{Joint, JointOf, JointSnapFor, PartInShip, Peer, Ship}; +use crate::attachment::{Joint, JointOf, SnapOfJoint, PartInShip, Peer, Ship}; use crate::config::planet::Planet; use crate::ecs::{DragRequestEvent, Part, Particles, Player, ThrustEvent}; use bevy::app::{App, PluginGroup, PluginGroupBuilder}; @@ -34,7 +34,7 @@ pub fn register_everything(app: &mut App) { .replicate::() .replicate::() .replicate::() - .replicate::(); + .replicate::(); } fn physics_setup_plugin(app: &mut App) {