mod creation;
mod interaction;
mod lifecycle;
pub use creation::{create_rotation_gizmo, create_scale_gizmo, create_translation_gizmo};
pub use interaction::{
GizmoDragMode, check_gizmo_axis_hit, highlight_gizmo_axis, set_gizmo_drag_visibility,
};
pub use lifecycle::{
destroy_gizmo, hide_entities, is_gizmo_entity, show_entities, update_gizmo_transform,
};
use crate::prelude::*;
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub enum GizmoMode {
#[default]
LocalTranslation,
GlobalTranslation,
Rotation,
Scale,
}
pub struct GizmoState {
pub root: Entity,
pub target: Entity,
pub mode: GizmoMode,
pub axis_entities: GizmoAxisEntities,
}
#[derive(Debug, Clone, Default)]
pub struct GizmoAxisEntities {
pub x_axis: Option<Entity>,
pub y_axis: Option<Entity>,
pub z_axis: Option<Entity>,
pub center_cube: Option<Entity>,
pub xy_plane: Option<Entity>,
pub yz_plane: Option<Entity>,
pub xz_plane: Option<Entity>,
pub x_axis_line: Option<Entity>,
pub y_axis_line: Option<Entity>,
pub z_axis_line: Option<Entity>,
}
#[derive(Debug, Clone, Copy)]
pub struct GizmoConfig {
pub arrow_length: f32,
pub arrow_radius: f32,
pub cone_height: f32,
pub cone_radius: f32,
pub highlight_factor: f32,
pub normal_factor: f32,
pub scale_factor: f32,
pub min_scale: f32,
pub max_scale: f32,
}
impl Default for GizmoConfig {
fn default() -> Self {
Self {
arrow_length: 2.0,
arrow_radius: 0.06,
cone_height: 0.5,
cone_radius: 0.15,
highlight_factor: 1.0,
normal_factor: 1.0,
scale_factor: 0.08,
min_scale: 0.3,
max_scale: 50.0,
}
}
}
fn set_gizmo_layer(world: &mut World, entity: Entity) {
if let Some(render_layer) = world.core.get_render_layer_mut(entity) {
render_layer.0 = RenderLayer::OVERLAY;
}
}
struct AxisArrowParams {
parent: Entity,
direction: Vec3,
color: Vec3,
length: f32,
cylinder_radius: f32,
cone_height: f32,
cone_radius: f32,
axis_name: String,
}
struct AxisWithCubeParams {
parent: Entity,
direction: Vec3,
color: Vec3,
length: f32,
cylinder_radius: f32,
cube_size: f32,
axis_name: String,
}
struct RotationRingParams {
parent: Entity,
axis: Vec3,
color: Vec3,
ring_radius: f32,
axis_name: String,
}