cargo fmt

This commit is contained in:
rewin
2024-01-12 20:59:58 +03:00
parent bd8cd88c50
commit fd35acc498
9 changed files with 441 additions and 447 deletions
-1
View File
@@ -100,7 +100,6 @@ fn camera_control_kinematic(
Lifecycle::Stop => any_stopped = true, Lifecycle::Stop => any_stopped = true,
} }
match motion { match motion {
Pan(delta) => do_pan(proj, &window, *delta, &mut xform, &mut controller), Pan(delta) => do_pan(proj, &window, *delta, &mut xform, &mut controller),
Zoom(delta) => do_zoom(&window, *delta, &mut xform, &mut controller), Zoom(delta) => do_zoom(&window, *delta, &mut xform, &mut controller),
+7 -11
View File
@@ -13,7 +13,6 @@ impl Plugin for StudioInputPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
app.add_event::<InputAction>(); app.add_event::<InputAction>();
// Reading each frame of the mouse delta allows // Reading each frame of the mouse delta allows
// to get rid of the bug that delta is counted from the last reading, // to get rid of the bug that delta is counted from the last reading,
// which leads to camera jumps if you move the mouse between clicks // which leads to camera jumps if you move the mouse between clicks
@@ -32,7 +31,7 @@ impl Plugin for StudioInputPlugin {
translate_debug_toggle, translate_debug_toggle,
translate_dcc_camera_events, translate_dcc_camera_events,
translate_fps_camera_events, translate_fps_camera_events,
send_undo_event send_undo_event,
) )
.in_set(StudioInputSystem) .in_set(StudioInputSystem)
.after(bevy::input::InputSystem) .after(bevy::input::InputSystem)
@@ -55,7 +54,7 @@ pub enum Lifecycle {
pub enum Action { pub enum Action {
Camera(CameraMotion), Camera(CameraMotion),
Selection(Selection), Selection(Selection),
ToggleDebug ToggleDebug,
} }
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
@@ -85,7 +84,6 @@ impl From<Selection> for Action {
} }
} }
// TODO: Make the bindings of raw device inputs to InputActions configurable // TODO: Make the bindings of raw device inputs to InputActions configurable
fn translate_selection_events(keyboard: Res<Input<KeyCode>>, mut input: EventWriter<InputAction>) { fn translate_selection_events(keyboard: Res<Input<KeyCode>>, mut input: EventWriter<InputAction>) {
@@ -308,22 +306,20 @@ impl LastFrameMouseDelta {
} }
} }
fn read_mouse_delta(mut mouse_motion: EventReader<MouseMotion>, mut last_delta: ResMut<LastFrameMouseDelta>) { fn read_mouse_delta(
mut mouse_motion: EventReader<MouseMotion>,
mut last_delta: ResMut<LastFrameMouseDelta>,
) {
let delta = mouse_motion let delta = mouse_motion
.read() .read()
.fold(Vec2::ZERO, |accum, current| accum + current.delta); .fold(Vec2::ZERO, |accum, current| accum + current.delta);
last_delta.0 = delta; last_delta.0 = delta;
} }
// TODO: Make it configurable // TODO: Make it configurable
fn send_undo_event( fn send_undo_event(mut events: EventWriter<UndoRedo>, keyboard: Res<Input<KeyCode>>) {
mut events : EventWriter<UndoRedo>,
keyboard: Res<Input<KeyCode>>,
) {
if keyboard.pressed(KeyCode::ControlLeft) && keyboard.just_pressed(KeyCode::Z) { if keyboard.pressed(KeyCode::ControlLeft) && keyboard.just_pressed(KeyCode::Z) {
events.send(UndoRedo::Undo); events.send(UndoRedo::Undo);
info!("Undo event sent"); info!("Undo event sent");
} }
} }
+140 -135
View File
@@ -20,143 +20,148 @@ pub(super) fn spawn_combo_translation_rotation_gizmo(
meshes: &GizmoMeshes, meshes: &GizmoMeshes,
mats: &GizmoMats, mats: &GizmoMats,
) { ) {
cmd.spawn(TransformGizmoBundle::new(target, target_global_transform, space, normalizing_scale)) cmd.spawn(TransformGizmoBundle::new(
.with_children(|cmd| { target,
use super::{ROT_X, ROT_Y, ROT_Z}; target_global_transform,
space,
normalizing_scale,
))
.with_children(|cmd| {
use super::{ROT_X, ROT_Y, ROT_Z};
// Center sphere // Center sphere
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
TranslationWidget::ScreenSpace, TranslationWidget::ScreenSpace,
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.translate_ss.clone(), mesh: meshes.translate_ss.clone(),
material: mats.translate_ss.clone(), material: mats.translate_ss.clone(),
transform: Transform::IDENTITY, transform: Transform::IDENTITY,
..default() ..default()
}, },
On::<Pointer<Over>>::run(on_gizmo_element_hover), On::<Pointer<Over>>::run(on_gizmo_element_hover),
On::<Pointer<Out>>::run(on_gizmo_element_unhover), On::<Pointer<Out>>::run(on_gizmo_element_unhover),
On::<Pointer<DragStart>>::run(on_translation_start), On::<Pointer<DragStart>>::run(on_translation_start),
On::<Pointer<Drag>>::run(on_translate), On::<Pointer<Drag>>::run(on_translate),
On::<Pointer<DragEnd>>::run(on_translation_end), On::<Pointer<DragEnd>>::run(on_translation_end),
)); ));
// Rotate X // Rotate X
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
RotationWidget::Axis(Vec3::X), RotationWidget::Axis(Vec3::X),
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.rotate_ring.clone(), mesh: meshes.rotate_ring.clone(),
material: mats.rotate_x.clone(), material: mats.rotate_x.clone(),
transform: Transform::from_rotation(ROT_X), transform: Transform::from_rotation(ROT_X),
..default() ..default()
}, },
On::<Pointer<Over>>::run(on_gizmo_element_hover), On::<Pointer<Over>>::run(on_gizmo_element_hover),
On::<Pointer<Out>>::run(on_gizmo_element_unhover), On::<Pointer<Out>>::run(on_gizmo_element_unhover),
On::<Pointer<DragStart>>::run(on_rotation_start), On::<Pointer<DragStart>>::run(on_rotation_start),
On::<Pointer<Drag>>::run(on_rotate), On::<Pointer<Drag>>::run(on_rotate),
On::<Pointer<DragEnd>>::run(on_rotation_end), On::<Pointer<DragEnd>>::run(on_rotation_end),
)); ));
// Translate X // Translate X
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
TranslationWidget::Axis(Vec3::X), TranslationWidget::Axis(Vec3::X),
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.translate_arrow.clone(), mesh: meshes.translate_arrow.clone(),
material: mats.translate_x.clone(), material: mats.translate_x.clone(),
transform: Transform { transform: Transform {
rotation: ROT_X, rotation: ROT_X,
translation: vec3(1.2, 0., 0.), translation: vec3(1.2, 0., 0.),
..default() ..default()
}, },
..default() ..default()
}, },
On::<Pointer<Over>>::run(on_gizmo_element_hover), On::<Pointer<Over>>::run(on_gizmo_element_hover),
On::<Pointer<Out>>::run(on_gizmo_element_unhover), On::<Pointer<Out>>::run(on_gizmo_element_unhover),
On::<Pointer<DragStart>>::run(on_translation_start), On::<Pointer<DragStart>>::run(on_translation_start),
On::<Pointer<Drag>>::run(on_translate), On::<Pointer<Drag>>::run(on_translate),
On::<Pointer<DragEnd>>::run(on_translation_end), On::<Pointer<DragEnd>>::run(on_translation_end),
)); ));
// Rotate Y // Rotate Y
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
RotationWidget::Axis(Vec3::Y), RotationWidget::Axis(Vec3::Y),
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.rotate_ring.clone(), mesh: meshes.rotate_ring.clone(),
material: mats.rotate_y.clone(), material: mats.rotate_y.clone(),
transform: Transform::from_rotation(ROT_Y), transform: Transform::from_rotation(ROT_Y),
..default() ..default()
}, },
On::<Pointer<Over>>::run(on_gizmo_element_hover), On::<Pointer<Over>>::run(on_gizmo_element_hover),
On::<Pointer<Out>>::run(on_gizmo_element_unhover), On::<Pointer<Out>>::run(on_gizmo_element_unhover),
On::<Pointer<DragStart>>::run(on_rotation_start), On::<Pointer<DragStart>>::run(on_rotation_start),
On::<Pointer<Drag>>::run(on_rotate), On::<Pointer<Drag>>::run(on_rotate),
On::<Pointer<DragEnd>>::run(on_rotation_end), On::<Pointer<DragEnd>>::run(on_rotation_end),
)); ));
// Translate Y // Translate Y
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
TranslationWidget::Axis(Vec3::Y), TranslationWidget::Axis(Vec3::Y),
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.translate_arrow.clone(), mesh: meshes.translate_arrow.clone(),
material: mats.translate_y.clone(), material: mats.translate_y.clone(),
transform: Transform { transform: Transform {
rotation: ROT_Y, rotation: ROT_Y,
translation: vec3(0., 1.2, 0.), translation: vec3(0., 1.2, 0.),
..default() ..default()
}, },
..default() ..default()
}, },
On::<Pointer<Over>>::run(on_gizmo_element_hover), On::<Pointer<Over>>::run(on_gizmo_element_hover),
On::<Pointer<Out>>::run(on_gizmo_element_unhover), On::<Pointer<Out>>::run(on_gizmo_element_unhover),
On::<Pointer<DragStart>>::run(on_translation_start), On::<Pointer<DragStart>>::run(on_translation_start),
On::<Pointer<Drag>>::run(on_translate), On::<Pointer<Drag>>::run(on_translate),
On::<Pointer<DragEnd>>::run(on_translation_end), On::<Pointer<DragEnd>>::run(on_translation_end),
)); ));
// Rotate Z // Rotate Z
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
RotationWidget::Axis(Vec3::Z), RotationWidget::Axis(Vec3::Z),
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.rotate_ring.clone(), mesh: meshes.rotate_ring.clone(),
material: mats.rotate_z.clone(), material: mats.rotate_z.clone(),
transform: Transform::from_rotation(ROT_Z), transform: Transform::from_rotation(ROT_Z),
..default() ..default()
}, },
On::<Pointer<Over>>::run(on_gizmo_element_hover), On::<Pointer<Over>>::run(on_gizmo_element_hover),
On::<Pointer<Out>>::run(on_gizmo_element_unhover), On::<Pointer<Out>>::run(on_gizmo_element_unhover),
On::<Pointer<DragStart>>::run(on_rotation_start), On::<Pointer<DragStart>>::run(on_rotation_start),
On::<Pointer<Drag>>::run(on_rotate), On::<Pointer<Drag>>::run(on_rotate),
On::<Pointer<DragEnd>>::run(on_rotation_end), On::<Pointer<DragEnd>>::run(on_rotation_end),
)); ));
// Translate Z // Translate Z
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
TranslationWidget::Axis(Vec3::Z), TranslationWidget::Axis(Vec3::Z),
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.translate_arrow.clone(), mesh: meshes.translate_arrow.clone(),
material: mats.translate_z.clone(), material: mats.translate_z.clone(),
transform: Transform { transform: Transform {
rotation: ROT_Z, rotation: ROT_Z,
translation: vec3(0., 0., 1.2), translation: vec3(0., 0., 1.2),
..default() ..default()
}, },
..default() ..default()
}, },
On::<Pointer<Over>>::run(on_gizmo_element_hover), On::<Pointer<Over>>::run(on_gizmo_element_hover),
On::<Pointer<Out>>::run(on_gizmo_element_unhover), On::<Pointer<Out>>::run(on_gizmo_element_unhover),
On::<Pointer<DragStart>>::run(on_translation_start), On::<Pointer<DragStart>>::run(on_translation_start),
On::<Pointer<Drag>>::run(on_translate), On::<Pointer<Drag>>::run(on_translate),
On::<Pointer<DragEnd>>::run(on_translation_end), On::<Pointer<DragEnd>>::run(on_translation_end),
)); ));
}); });
} }
+6 -8
View File
@@ -5,7 +5,7 @@ use crate::interaction::TransformSpace;
#[derive(Component, Reflect)] #[derive(Component, Reflect)]
pub(super) struct TransformGizmo { pub(super) struct TransformGizmo {
pub(super) target : Entity, pub(super) target: Entity,
pub(super) transform_space: TransformSpace, pub(super) transform_space: TransformSpace,
} }
@@ -24,20 +24,19 @@ pub(super) struct InitialTransform(pub GlobalTransform);
impl TransformGizmoBundle { impl TransformGizmoBundle {
pub fn new( pub fn new(
target : Entity, target: Entity,
target_global_transform : &GlobalTransform, target_global_transform: &GlobalTransform,
space: TransformSpace, space: TransformSpace,
normalizing_scale: f32, normalizing_scale: f32,
) -> Self { ) -> Self {
let name = Name::new("TransformGizmo"); let name = Name::new("TransformGizmo");
let marker = TransformGizmo { let marker = TransformGizmo {
target, target,
transform_space: space transform_space: space,
}; };
match space { match space {
TransformSpace::Local => { TransformSpace::Local => {
let mut transform = target_global_transform.compute_transform(); let mut transform = target_global_transform.compute_transform();
transform.scale = Vec3::splat(normalizing_scale); transform.scale = Vec3::splat(normalizing_scale);
@@ -45,14 +44,13 @@ impl TransformGizmoBundle {
name, name,
marker, marker,
spatial: SpatialBundle { spatial: SpatialBundle {
global_transform : GlobalTransform::from(transform), global_transform: GlobalTransform::from(transform),
transform, transform,
..default() ..default()
}, },
} }
} }
TransformSpace::World => { TransformSpace::World => {
let transform = Transform::from_translation(target_global_transform.translation()) let transform = Transform::from_translation(target_global_transform.translation())
.with_scale(Vec3::splat(normalizing_scale)); .with_scale(Vec3::splat(normalizing_scale));
@@ -60,7 +58,7 @@ impl TransformGizmoBundle {
name, name,
marker, marker,
spatial: SpatialBundle { spatial: SpatialBundle {
global_transform : GlobalTransform::from(transform), global_transform: GlobalTransform::from(transform),
transform, transform,
..default() ..default()
}, },
+13 -18
View File
@@ -33,10 +33,8 @@ const ROT_Z: Quat = Quat::from_xyzw(CIRC_45, 0., 0., CIRC_45);
pub struct GizmoPlugin; pub struct GizmoPlugin;
impl Plugin for GizmoPlugin { impl Plugin for GizmoPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
app.register_type::<TransformGizmo>(); app.register_type::<TransformGizmo>();
app.add_event::<RebuildGizmo>(); app.add_event::<RebuildGizmo>();
@@ -60,8 +58,10 @@ impl Plugin for GizmoPlugin {
resource_exists::<Selection>() resource_exists::<Selection>()
.and_then(not(any_with_component::<TransformGizmo>())), .and_then(not(any_with_component::<TransformGizmo>())),
), ),
(update_target_global_trasform, sync_gizmo_transform).chain().after(CameraMotionSystem), (update_target_global_trasform, sync_gizmo_transform)
normalize_gizmo_scale.after(CameraMotionSystem) .chain()
.after(CameraMotionSystem),
normalize_gizmo_scale.after(CameraMotionSystem),
), ),
); );
app.add_systems( app.add_systems(
@@ -71,10 +71,7 @@ impl Plugin for GizmoPlugin {
} }
} }
fn despawn_existing_gizmo( fn despawn_existing_gizmo(mut cmd: Commands, q_gizmos: Query<Entity, With<TransformGizmo>>) {
mut cmd: Commands,
q_gizmos: Query<Entity, With<TransformGizmo>>,
) {
for ent in q_gizmos.iter() { for ent in q_gizmos.iter() {
cmd.entity(ent).despawn_recursive(); cmd.entity(ent).despawn_recursive();
} }
@@ -142,11 +139,10 @@ fn spawn_gizmo(
} }
} }
fn sync_gizmo_transform( fn sync_gizmo_transform(
mut cmd : Commands, mut cmd: Commands,
mut q_gizmo : Query<(&mut Transform, &TransformGizmo)>, mut q_gizmo: Query<(&mut Transform, &TransformGizmo)>,
q_targets : Query<&GlobalTransform> q_targets: Query<&GlobalTransform>,
) { ) {
for (mut transform, gizmo) in q_gizmo.iter_mut() { for (mut transform, gizmo) in q_gizmo.iter_mut() {
if let Ok(target) = q_targets.get(gizmo.target) { if let Ok(target) = q_targets.get(gizmo.target) {
@@ -155,10 +151,10 @@ fn sync_gizmo_transform(
let target_transform = target.compute_transform(); let target_transform = target.compute_transform();
transform.translation = target_transform.translation; transform.translation = target_transform.translation;
transform.rotation = target_transform.rotation; transform.rotation = target_transform.rotation;
}, }
super::TransformSpace::World => { super::TransformSpace::World => {
transform.translation = target.translation(); transform.translation = target.translation();
}, }
} }
} else { } else {
cmd.entity(gizmo.target).despawn_recursive(); cmd.entity(gizmo.target).despawn_recursive();
@@ -167,9 +163,9 @@ fn sync_gizmo_transform(
} }
fn update_target_global_trasform( fn update_target_global_trasform(
mut q_gizmo : Query<&TransformGizmo>, mut q_gizmo: Query<&TransformGizmo>,
mut q_targets : ParamSet<(TransformHelper,)>, mut q_targets: ParamSet<(TransformHelper,)>,
mut q_targets_global : Query<&mut GlobalTransform> mut q_targets_global: Query<&mut GlobalTransform>,
) { ) {
for gizmo in q_gizmo.iter_mut() { for gizmo in q_gizmo.iter_mut() {
if let Ok(global_transform) = q_targets.p0().compute_global_transform(gizmo.target) { if let Ok(global_transform) = q_targets.p0().compute_global_transform(gizmo.target) {
@@ -180,7 +176,6 @@ fn update_target_global_trasform(
} }
} }
fn normalize_gizmo_scale( fn normalize_gizmo_scale(
q_cam_xform: Query<&Transform, With<MainCamera>>, q_cam_xform: Query<&Transform, With<MainCamera>>,
mut q_gizmo: Query< mut q_gizmo: Query<
+86 -89
View File
@@ -48,85 +48,85 @@ pub(super) fn spawn_rotation_gizmo(
mats: &GizmoMats, mats: &GizmoMats,
) { ) {
cmd.spawn(( cmd.spawn((
TransformGizmoBundle::new(target, target_global_transform, space, normalizing_scale), TransformGizmoBundle::new(target, target_global_transform, space, normalizing_scale),
On::<Pointer<DragStart>>::run(on_rotation_start), On::<Pointer<DragStart>>::run(on_rotation_start),
On::<Pointer<Drag>>::run(on_rotate), On::<Pointer<Drag>>::run(on_rotate),
On::<Pointer<DragEnd>>::run(on_rotation_end), On::<Pointer<DragEnd>>::run(on_rotation_end),
)) ))
.with_children(|cmd| { .with_children(|cmd| {
use super::{ROT_X, ROT_Y, ROT_Z}; use super::{ROT_X, ROT_Y, ROT_Z};
// Trackball // Trackball
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
RotationWidget::Trackball, RotationWidget::Trackball,
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.rotate_ball.clone(), mesh: meshes.rotate_ball.clone(),
material: mats.rotate_trackball.clone(), material: mats.rotate_trackball.clone(),
..default() ..default()
}, },
On::<Pointer<Over>>::run(on_trackball_hover), On::<Pointer<Over>>::run(on_trackball_hover),
On::<Pointer<Out>>::run(on_trackball_unhover), On::<Pointer<Out>>::run(on_trackball_unhover),
)); ));
// Screen-space // Screen-space
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
RotationWidget::ScreenSpace, RotationWidget::ScreenSpace,
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.rotate_ss.clone(), mesh: meshes.rotate_ss.clone(),
material: mats.rotate_ss.clone(), material: mats.rotate_ss.clone(),
..default() ..default()
}, },
On::<Pointer<Over>>::run(on_gizmo_element_hover), On::<Pointer<Over>>::run(on_gizmo_element_hover),
On::<Pointer<Out>>::run(on_gizmo_element_unhover), On::<Pointer<Out>>::run(on_gizmo_element_unhover),
)); ));
// X // X
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
RotationWidget::Axis(Vec3::X), RotationWidget::Axis(Vec3::X),
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.rotate_ring.clone(), mesh: meshes.rotate_ring.clone(),
material: mats.rotate_x.clone(), material: mats.rotate_x.clone(),
transform: Transform::from_rotation(ROT_X), transform: Transform::from_rotation(ROT_X),
..default() ..default()
}, },
On::<Pointer<Over>>::run(on_gizmo_element_hover), On::<Pointer<Over>>::run(on_gizmo_element_hover),
On::<Pointer<Out>>::run(on_gizmo_element_unhover), On::<Pointer<Out>>::run(on_gizmo_element_unhover),
)); ));
// Y // Y
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
RotationWidget::Axis(Vec3::Y), RotationWidget::Axis(Vec3::Y),
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.rotate_ring.clone(), mesh: meshes.rotate_ring.clone(),
material: mats.rotate_y.clone(), material: mats.rotate_y.clone(),
transform: Transform::from_rotation(ROT_Y), transform: Transform::from_rotation(ROT_Y),
..default() ..default()
}, },
On::<Pointer<Over>>::run(on_gizmo_element_hover), On::<Pointer<Over>>::run(on_gizmo_element_hover),
On::<Pointer<Out>>::run(on_gizmo_element_unhover), On::<Pointer<Out>>::run(on_gizmo_element_unhover),
)); ));
// Z // Z
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
RotationWidget::Axis(Vec3::Z), RotationWidget::Axis(Vec3::Z),
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.rotate_ring.clone(), mesh: meshes.rotate_ring.clone(),
material: mats.rotate_z.clone(), material: mats.rotate_z.clone(),
transform: Transform::from_rotation(ROT_Z), transform: Transform::from_rotation(ROT_Z),
..default() ..default()
}, },
On::<Pointer<Over>>::run(on_gizmo_element_hover), On::<Pointer<Over>>::run(on_gizmo_element_hover),
On::<Pointer<Out>>::run(on_gizmo_element_unhover), On::<Pointer<Out>>::run(on_gizmo_element_unhover),
)); ));
}); });
} }
pub(super) fn update_ss_ring_rotation( pub(super) fn update_ss_ring_rotation(
@@ -179,7 +179,7 @@ pub(super) fn on_rotation_start(
event: Listener<Pointer<DragStart>>, event: Listener<Pointer<DragStart>>,
mut cmd: Commands, mut cmd: Commands,
q_xform: Query<(Entity, &GlobalTransform)>, q_xform: Query<(Entity, &GlobalTransform)>,
q_gizmos: Query<&TransformGizmo> q_gizmos: Query<&TransformGizmo>,
) { ) {
info!("Rotation start"); info!("Rotation start");
@@ -211,7 +211,7 @@ pub(super) fn on_rotation_end(
mut cmd: Commands, mut cmd: Commands,
r_xform_mode: Res<TransformMode>, r_xform_mode: Res<TransformMode>,
mut ev_rebuild_gizmo: EventWriter<RebuildGizmo>, mut ev_rebuild_gizmo: EventWriter<RebuildGizmo>,
q_inited_components: Query<Entity, With<LastRotation>> q_inited_components: Query<Entity, With<LastRotation>>,
) { ) {
info!("Rotation end"); info!("Rotation end");
@@ -223,7 +223,6 @@ pub(super) fn on_rotation_end(
.remove::<LastRotation>(); .remove::<LastRotation>();
} }
if matches!(r_xform_mode.space, TransformSpace::World) { if matches!(r_xform_mode.space, TransformSpace::World) {
ev_rebuild_gizmo.send(RebuildGizmo); ev_rebuild_gizmo.send(RebuildGizmo);
} }
@@ -232,16 +231,14 @@ pub(super) fn on_rotation_end(
pub(super) fn on_rotate( pub(super) fn on_rotate(
event: Listener<Pointer<Drag>>, event: Listener<Pointer<Drag>>,
mut raycast: Raycast, mut raycast: Raycast,
mut q_root: Query< mut q_root: Query<(
( &mut Transform,
&mut Transform, Option<&Parent>,
Option<&Parent>, &InitialTransform,
&InitialTransform, &InitialHitPoint,
&InitialHitPoint, &mut LastHitPoint,
&mut LastHitPoint, &mut LastRotation,
&mut LastRotation, )>,
),
>,
q_camera: Query<(&Camera, &GlobalTransform), With<MainCamera>>, q_camera: Query<(&Camera, &GlobalTransform), With<MainCamera>>,
q_gizmo: Query<&GlobalTransform, (With<TransformGizmo>, Without<MainCamera>)>, q_gizmo: Query<&GlobalTransform, (With<TransformGizmo>, Without<MainCamera>)>,
q_world_xforms: Query<&GlobalTransform, (With<Children>, Without<MainCamera>)>, q_world_xforms: Query<&GlobalTransform, (With<Children>, Without<MainCamera>)>,
+182 -177
View File
@@ -1,10 +1,5 @@
use bevy::{ use bevy::{math::vec3, pbr::NotShadowCaster, prelude::*, render::view::RenderLayers};
math::vec3, pbr::NotShadowCaster, prelude::*, use bevy_mod_picking::prelude::{Drag, DragEnd, DragStart, Listener, On, Out, Over, Pointer};
render::view::RenderLayers,
};
use bevy_mod_picking::prelude::{
Drag, DragEnd, DragStart, Listener, On, Out, Over, Pointer,
};
use crate::{interaction::TransformSpace, MainCamera}; use crate::{interaction::TransformSpace, MainCamera};
@@ -31,181 +26,181 @@ pub(super) fn spawn_translation_gizmo(
mats: &GizmoMats, mats: &GizmoMats,
) { ) {
cmd.spawn(( cmd.spawn((
TransformGizmoBundle::new(target, target_global_transform, space, normalizing_scale), TransformGizmoBundle::new(target, target_global_transform, space, normalizing_scale),
On::<Pointer<Over>>::run(on_gizmo_element_hover), On::<Pointer<Over>>::run(on_gizmo_element_hover),
On::<Pointer<Out>>::run(on_gizmo_element_unhover), On::<Pointer<Out>>::run(on_gizmo_element_unhover),
On::<Pointer<DragStart>>::run(on_translation_start), On::<Pointer<DragStart>>::run(on_translation_start),
On::<Pointer<Drag>>::run(on_translate), On::<Pointer<Drag>>::run(on_translate),
On::<Pointer<DragEnd>>::run(on_translation_end), On::<Pointer<DragEnd>>::run(on_translation_end),
)) ))
.with_children(|cmd| { .with_children(|cmd| {
use super::{CIRC_45, ROT_X, ROT_Y, ROT_Z}; use super::{CIRC_45, ROT_X, ROT_Y, ROT_Z};
// Center sphere // Center sphere
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
TranslationWidget::ScreenSpace, TranslationWidget::ScreenSpace,
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.translate_ss.clone(), mesh: meshes.translate_ss.clone(),
material: mats.translate_ss.clone(), material: mats.translate_ss.clone(),
transform: Transform::IDENTITY, transform: Transform::IDENTITY,
..default() ..default()
}, },
)); ));
// X // X
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
TranslationWidget::Axis(Vec3::X), TranslationWidget::Axis(Vec3::X),
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.translate_line.clone(), mesh: meshes.translate_line.clone(),
material: mats.translate_x.clone(), material: mats.translate_x.clone(),
transform: Transform { transform: Transform {
rotation: ROT_X, rotation: ROT_X,
translation: vec3(0.6, 0., 0.), translation: vec3(0.6, 0., 0.),
..default() ..default()
}, },
..default() ..default()
}, },
)); ));
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
TranslationWidget::Axis(Vec3::X), TranslationWidget::Axis(Vec3::X),
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.translate_arrow.clone(), mesh: meshes.translate_arrow.clone(),
material: mats.translate_x.clone(), material: mats.translate_x.clone(),
transform: Transform { transform: Transform {
rotation: ROT_X, rotation: ROT_X,
translation: vec3(1., 0., 0.), translation: vec3(1., 0., 0.),
..default() ..default()
}, },
..default() ..default()
}, },
)); ));
// Y // Y
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
TranslationWidget::Axis(Vec3::Y), TranslationWidget::Axis(Vec3::Y),
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.translate_line.clone(), mesh: meshes.translate_line.clone(),
material: mats.translate_y.clone(), material: mats.translate_y.clone(),
transform: Transform { transform: Transform {
rotation: ROT_Y, rotation: ROT_Y,
translation: vec3(0., 0.6, 0.), translation: vec3(0., 0.6, 0.),
..default() ..default()
}, },
..default() ..default()
}, },
)); ));
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
TranslationWidget::Axis(Vec3::Y), TranslationWidget::Axis(Vec3::Y),
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.translate_arrow.clone(), mesh: meshes.translate_arrow.clone(),
material: mats.translate_y.clone(), material: mats.translate_y.clone(),
transform: Transform { transform: Transform {
rotation: ROT_Y, rotation: ROT_Y,
translation: vec3(0., 1., 0.), translation: vec3(0., 1., 0.),
..default() ..default()
}, },
..default() ..default()
}, },
)); ));
// Z // Z
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
TranslationWidget::Axis(Vec3::Z), TranslationWidget::Axis(Vec3::Z),
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.translate_line.clone(), mesh: meshes.translate_line.clone(),
material: mats.translate_z.clone(), material: mats.translate_z.clone(),
transform: Transform { transform: Transform {
rotation: ROT_Z, rotation: ROT_Z,
translation: vec3(0., 0., 0.6), translation: vec3(0., 0., 0.6),
..default() ..default()
}, },
..default() ..default()
}, },
)); ));
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
TranslationWidget::Axis(Vec3::Z), TranslationWidget::Axis(Vec3::Z),
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.translate_arrow.clone(), mesh: meshes.translate_arrow.clone(),
material: mats.translate_z.clone(), material: mats.translate_z.clone(),
transform: Transform { transform: Transform {
rotation: ROT_Z, rotation: ROT_Z,
translation: vec3(0., 0., 1.), translation: vec3(0., 0., 1.),
..default() ..default()
}, },
..default() ..default()
}, },
)); ));
// YZ Plane // YZ Plane
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
TranslationWidget::Plane(Vec3::X), TranslationWidget::Plane(Vec3::X),
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.translate_plane.clone(), mesh: meshes.translate_plane.clone(),
material: mats.translate_yz.clone(), material: mats.translate_yz.clone(),
transform: Transform { transform: Transform {
rotation: ROT_X, rotation: ROT_X,
translation: vec3(0., CIRC_45, CIRC_45), translation: vec3(0., CIRC_45, CIRC_45),
..default() ..default()
}, },
..default() ..default()
}, },
)); ));
// XZ Plane // XZ Plane
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
TranslationWidget::Plane(Vec3::Y), TranslationWidget::Plane(Vec3::Y),
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.translate_plane.clone(), mesh: meshes.translate_plane.clone(),
material: mats.translate_xz.clone(), material: mats.translate_xz.clone(),
transform: Transform { transform: Transform {
rotation: ROT_Y, rotation: ROT_Y,
translation: vec3(CIRC_45, 0., CIRC_45), translation: vec3(CIRC_45, 0., CIRC_45),
..default() ..default()
}, },
..default() ..default()
}, },
)); ));
// XY Plane // XY Plane
cmd.spawn(( cmd.spawn((
NotShadowCaster, NotShadowCaster,
RenderLayers::layer(GIZMO_RENDER_LAYER), RenderLayers::layer(GIZMO_RENDER_LAYER),
TranslationWidget::Plane(Vec3::Z), TranslationWidget::Plane(Vec3::Z),
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.translate_plane.clone(), mesh: meshes.translate_plane.clone(),
material: mats.translate_xy.clone(), material: mats.translate_xy.clone(),
transform: Transform { transform: Transform {
rotation: ROT_Z, rotation: ROT_Z,
translation: vec3(CIRC_45, CIRC_45, 0.), translation: vec3(CIRC_45, CIRC_45, 0.),
..default() ..default()
}, },
..default() ..default()
}, },
)); ));
}); });
} }
pub(super) fn on_translation_start( pub(super) fn on_translation_start(
_: Listener<Pointer<DragStart>>, _: Listener<Pointer<DragStart>>,
mut cmd: Commands, mut cmd: Commands,
q_xform: Query<(Entity, &GlobalTransform)>, q_xform: Query<(Entity, &GlobalTransform)>,
q_gizmos: Query<&TransformGizmo> q_gizmos: Query<&TransformGizmo>,
) { ) {
for gizmo_data in q_gizmos.iter() { for gizmo_data in q_gizmos.iter() {
if let Ok((ent, &world_xform)) = q_xform.get(gizmo_data.target) { if let Ok((ent, &world_xform)) = q_xform.get(gizmo_data.target) {
@@ -230,10 +225,12 @@ pub(super) fn on_translate(
q_camera: Query<(&Camera, &GlobalTransform), With<MainCamera>>, q_camera: Query<(&Camera, &GlobalTransform), With<MainCamera>>,
q_gizmo: Query<(&GlobalTransform, &TransformGizmo), Without<MainCamera>>, q_gizmo: Query<(&GlobalTransform, &TransformGizmo), Without<MainCamera>>,
q_widget: Query<&TranslationWidget>, q_widget: Query<&TranslationWidget>,
q_all_global_transforms : Query<&GlobalTransform> q_all_global_transforms: Query<&GlobalTransform>,
) { ) {
let (gizmo_xform, gizmo_data) = q_gizmo.single(); let (gizmo_xform, gizmo_data) = q_gizmo.single();
let Ok((mut target_transform, target_global_transform, target_parent)) = q_root.get_mut(gizmo_data.target) else { let Ok((mut target_transform, target_global_transform, target_parent)) =
q_root.get_mut(gizmo_data.target)
else {
error!("Translation gizmo target not found"); error!("Translation gizmo target not found");
return; return;
}; };
@@ -272,8 +269,12 @@ pub(super) fn on_translate(
let target_ws = origin_ws + axis_ws * projection_length; let target_ws = origin_ws + axis_ws * projection_length;
if let Some(target_parent) = target_parent { if let Some(target_parent) = target_parent {
if let Ok(parent_global_transform) = q_all_global_transforms.get(target_parent.get()) { if let Ok(parent_global_transform) =
let real_local_transform = GlobalTransform::from(Transform::from_translation(target_ws)).reparented_to(parent_global_transform); q_all_global_transforms.get(target_parent.get())
{
let real_local_transform =
GlobalTransform::from(Transform::from_translation(target_ws))
.reparented_to(parent_global_transform);
target_transform.translation = real_local_transform.translation; target_transform.translation = real_local_transform.translation;
} }
} else { } else {
@@ -295,8 +296,12 @@ pub(super) fn on_translate(
let target_ws = ray.origin + ray.direction * hit_dist; let target_ws = ray.origin + ray.direction * hit_dist;
if let Some(target_parent) = target_parent { if let Some(target_parent) = target_parent {
if let Ok(parent_global_transform) = q_all_global_transforms.get(target_parent.get()) { if let Ok(parent_global_transform) =
let real_local_transform = GlobalTransform::from(Transform::from_translation(target_ws)).reparented_to(parent_global_transform); q_all_global_transforms.get(target_parent.get())
{
let real_local_transform =
GlobalTransform::from(Transform::from_translation(target_ws))
.reparented_to(parent_global_transform);
target_transform.translation = real_local_transform.translation; target_transform.translation = real_local_transform.translation;
} }
} else { } else {
+3 -4
View File
@@ -80,14 +80,14 @@ pub fn init(viewport_size: ViewportSize) {
SkyboxPlugin, SkyboxPlugin,
UiLayerPlugin, UiLayerPlugin,
WorldGridPlugin, WorldGridPlugin,
UndoPlugin UndoPlugin,
)) ))
.add_systems( .add_systems(
Startup, Startup,
move |mut cmd: Commands, mut ew: EventWriter<LoadSceneEvent>| { move |mut cmd: Commands, mut ew: EventWriter<LoadSceneEvent>| {
cmd.insert_resource(SkyboxId("gum_trees_4k".to_string())); cmd.insert_resource(SkyboxId("gum_trees_4k".to_string()));
ew.send(LoadSceneEvent("bookcase".to_string())); ew.send(LoadSceneEvent("bookcase".to_string()));
} },
); );
// Only for registering components for undo // Only for registering components for undo
@@ -147,7 +147,7 @@ pub fn start_viewer(
SkyboxPlugin, SkyboxPlugin,
UiLayerPlugin, UiLayerPlugin,
WorldGridPlugin, WorldGridPlugin,
UndoPlugin UndoPlugin,
)) ))
.add_systems( .add_systems(
Startup, Startup,
@@ -157,7 +157,6 @@ pub fn start_viewer(
}, },
); );
// Only for registering components for undo // Only for registering components for undo
use space_editor::prelude::space_undo::AppAutoUndo; use space_editor::prelude::space_undo::AppAutoUndo;
app.auto_reflected_undo::<Transform>(); app.auto_reflected_undo::<Transform>();
+2 -2
View File
@@ -13,7 +13,7 @@ use bevy::{
scene::InstanceId, scene::InstanceId,
}; };
use space_editor::prelude::{PrefabMarker, space_undo::OneFrameUndoIgnore}; use space_editor::prelude::{space_undo::OneFrameUndoIgnore, PrefabMarker};
#[cfg(feature = "wasm")] #[cfg(feature = "wasm")]
use wasm_bindgen::prelude::wasm_bindgen; use wasm_bindgen::prelude::wasm_bindgen;
@@ -209,7 +209,7 @@ fn spawn_next_scene(
SceneElement, SceneElement,
SpatialBundle::default(), SpatialBundle::default(),
PrefabMarker, PrefabMarker,
OneFrameUndoIgnore::default() //To prevert undo try to register add event OneFrameUndoIgnore::default(), //To prevert undo try to register add event
)) ))
.id(); .id();