use bevy_app::{App, Last, Plugin, PreUpdate};
use bevy_ecs::{schedule::IntoScheduleConfigs, system::Res};
use bevy_transform::components::Transform;
use godot::classes::{Node2D, Node3D};
use crate::plugins::core::AppSceneTreeExt;
use crate::plugins::transforms::IntoBevyTransform;
use crate::plugins::transforms::{GodotTransformConfig, TransformSyncMode};
use super::change_filter::TransformSyncMetadata;
use super::sync_systems::{post_update_godot_transforms, pre_update_godot_transforms};
pub struct GodotTransformSyncPlugin {
pub sync_mode: TransformSyncMode,
pub auto_sync: bool,
}
impl Default for GodotTransformSyncPlugin {
fn default() -> Self {
Self {
sync_mode: TransformSyncMode::default(),
auto_sync: true,
}
}
}
impl Plugin for GodotTransformSyncPlugin {
fn build(&self, app: &mut App) {
app.register_scene_tree_component_with_init::<Transform, _>(|entity, node| {
let mut node_handle = node.clone(); if let Some(node3d) = node_handle.try_get::<Node3D>() {
entity.insert(node3d.get_transform().to_bevy_transform());
} else if let Some(node2d) = node_handle.try_get::<Node2D>() {
entity.insert(node2d.get_transform().to_bevy_transform());
}
})
.register_scene_tree_component::<TransformSyncMetadata>();
app.insert_resource(GodotTransformConfig {
sync_mode: self.sync_mode,
});
if self.auto_sync {
app.add_systems(
PreUpdate,
pre_update_godot_transforms.run_if(transform_sync_twoway_enabled),
);
app.add_systems(
Last,
post_update_godot_transforms.run_if(transform_sync_enabled),
);
}
}
}
fn transform_sync_enabled(config: Res<GodotTransformConfig>) -> bool {
config.sync_mode != TransformSyncMode::Disabled
}
fn transform_sync_twoway_enabled(config: Res<GodotTransformConfig>) -> bool {
config.sync_mode == TransformSyncMode::TwoWay
}