Skip to content
This repository was archived by the owner on Apr 16, 2026. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions bevy_editor_panes/bevy_3d_viewport/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,10 @@ use bevy_editor_cam::prelude::{DefaultEditorCamPlugins, EditorCam};
use bevy_editor_styles::Theme;
use bevy_infinite_grid::{InfiniteGrid, InfiniteGridPlugin, InfiniteGridSettings};
use bevy_pane_layout::prelude::*;
use bevy_transform_gizmos::{TransformGizmo, prelude::*};
use bevy_transform_gizmos::{TransformGizmo, messages::ViewportResized, prelude::*};
use view_gizmo::ViewGizmoPlugin;

use crate::{selection_box::SelectionBoxPlugin, view_gizmo::view_gizmo_node};

mod selection_box;
mod view_gizmo;

Expand Down Expand Up @@ -50,6 +49,7 @@ impl Plugin for Viewport3dPanePlugin {
}

app.add_plugins((DefaultEditorCamPlugins, ViewGizmoPlugin, SelectionBoxPlugin))
.add_message::<ViewportResized>()
.add_systems(Startup, setup)
.add_systems(
First,
Expand Down Expand Up @@ -231,6 +231,7 @@ fn update_render_target_size(
bodies: Query<&PaneContentNode>,
children_query: Query<&Children>,
computed_node_query: Query<&ComputedNode, Changed<ComputedNode>>,
mut messages: MessageWriter<ViewportResized>,
mut images: ResMut<Assets<Image>>,
) {
for (pane_root, viewport) in &query {
Expand All @@ -246,7 +247,11 @@ fn update_render_target_size(
};
// TODO Convert to physical pixels
let content_node_size = computed_node.size();

let size_array = [content_node_size.x, content_node_size.y];
messages.write(ViewportResized {
pane_entity: pane_root,
size: size_array,
});
let camera = camera_query.get_mut(viewport.camera_id).unwrap();

let image_handle = camera.target.as_image().unwrap();
Expand Down
11 changes: 11 additions & 0 deletions crates/bevy_events/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[package]
name = "bevy_events"
version = "0.1.0"
edition = "2024"

[dependencies]
bevy.workspace = true
bevy_editor_core.workspace = true

[lints]
workspace = true
16 changes: 16 additions & 0 deletions crates/bevy_events/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//! This module contains events and messages used throughout the Bevy editor
use bevy::prelude::Entity;
use bevy::prelude::Message;

/// Viewport size in pixels as a 2D vector.
pub type ViewportSize = [f32; 2];

/// Event emitted when a viewport (pane/editor panel) resizes.
/// Used for dynamic gizmo scaling
#[derive(Message, Clone)]
pub struct ViewportResized {
/// Entity of the pane/viewport that resized (for multi-pane editors).
pub pane_entity: Entity,
/// New viewport size in pixels.
pub size: ViewportSize,
}
27 changes: 26 additions & 1 deletion crates/bevy_transform_gizmos/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,11 @@ use bevy::{prelude::*, transform::TransformSystems};
use bevy_editor_core::selection::EditorSelection;
use mesh::{RotationGizmo, ViewTranslateGizmo};

use messages::ViewportResized;
use normalization::*;

mod mesh;
pub mod messages;
pub mod normalization;

/// Crate prelude.
Expand Down Expand Up @@ -103,6 +105,8 @@ pub struct TransformGizmoSettings {
pub snap_enabled: bool,
/// Current gizmo mode.
pub mode: GizmoMode,
/// Current gizmo scale.
pub viewport_scale: f32,
}

impl Default for TransformGizmoSettings {
Expand All @@ -115,6 +119,7 @@ impl Default for TransformGizmoSettings {
angle_snap: 15.0, // 15 degree angle snapping
scale_snap: 0.1, // 0.1 scale increment snapping
snap_enabled: true, // Enable snapping by default
viewport_scale: 1.0,
mode: GizmoMode::default(),
}
}
Expand All @@ -129,6 +134,8 @@ impl Plugin for TransformGizmoPlugin {
if !app.is_plugin_added::<MeshPickingPlugin>() {
app.add_plugins(MeshPickingPlugin);
}
app.add_message::<ViewportResized>();

app.init_resource::<TransformGizmoSettings>()
.add_plugins(Ui3dNormalizationPlugin)
.add_message::<TransformGizmoEvent>()
Expand Down Expand Up @@ -164,6 +171,7 @@ impl Plugin for TransformGizmoPlugin {
(adjust_view_translate_gizmo, gizmo_cam_copy_settings)
.chain()
.in_set(TransformGizmoSystems::Drag),
transform_gizmo_viewport_handler,
)
.chain()
.in_set(TransformGizmoSystems::Main)
Expand Down Expand Up @@ -661,6 +669,7 @@ fn place_gizmo(

fn propagate_gizmo_elements(
gizmo: Query<(&GlobalTransform, &Children), With<TransformGizmo>>,
settings: Res<TransformGizmoSettings>,
mut gizmo_parts_query: Query<(&Transform, &mut GlobalTransform), Without<TransformGizmo>>,
) {
if let Ok((gizmo_pos, gizmo_parts)) = gizmo.single() {
Expand All @@ -669,7 +678,12 @@ fn propagate_gizmo_elements(
error!("Malformed transform gizmo");
continue;
};
*g_transform = gizmo_pos.mul_transform(*transform);
let scaled_transform = Transform {
translation: transform.translation * settings.viewport_scale,
rotation: transform.rotation,
scale: Vec3::splat(settings.viewport_scale),
};
*g_transform = gizmo_pos.mul_transform(scaled_transform);
}
}
}
Expand Down Expand Up @@ -866,3 +880,14 @@ fn update_gizmo_visibility(
}
}
}

fn transform_gizmo_viewport_handler(
mut messages: MessageReader<ViewportResized>,
mut settings: ResMut<TransformGizmoSettings>,
) {
for msg in messages.read() {
let viewport_height = msg.size[1];
let scale = (viewport_height / 600.0).clamp(0.3, 3.0);
settings.viewport_scale = scale;
}
}
16 changes: 16 additions & 0 deletions crates/bevy_transform_gizmos/src/messages.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//! This module contains events/messages used to communicate with the transform gizmo plugin.
use bevy::prelude::Entity;
use bevy::prelude::Message;

/// Viewport size in pixels as a 2D vector.
pub type ViewportSize = [f32; 2];

/// Event emitted when a viewport (pane/editor panel) resizes.
/// Used for dynamic gizmo scaling
#[derive(Message, Clone)]
pub struct ViewportResized {
/// Entity of the pane/viewport that resized (for multi-pane editors).
pub pane_entity: Entity,
/// New viewport size in pixels.
pub size: ViewportSize,
}