Este guia documenta como usar o Eguizmo (fork do egui-gizmo) no seu projeto, com foco no fluxo que voce ja usa no Dengine.
Eguizmo fornece um gizmo 3D para manipulacao de transform (mover, rotacionar, escalar) dentro de UI egui.
No Cargo.toml:
[dependencies]
egui-gizmo = { git = "https://github.com/SEU_USUARIO/Eguizmo", branch = "main" }
glam = { version = "0.31.0", features = ["mint"] }[dependencies]
egui-gizmo = { git = "https://github.com/dumestre/Eguizmo", branch = "main" }
glam = { version = "0.31.0", features = ["mint"] }Imports:
use egui_gizmo::{Gizmo, GizmoMode, GizmoOrientation};
use glam::Mat4;Exemplo minimo:
let gizmo = Gizmo::new("scene_transform_gizmo")
.view_matrix(view.to_cols_array_2d().into())
.projection_matrix(proj.to_cols_array_2d().into())
.model_matrix(model_matrix.to_cols_array_2d().into())
.mode(GizmoMode::Translate)
.orientation(GizmoOrientation::Global)
.viewport(viewport_rect);
if let Some(result) = gizmo.interact(ui) {
model_matrix = Mat4::from(result.transform());
}No projeto atual:
- A viewport foi separada em
src/viewport.rs. - O gizmo e desenhado dentro de
ViewportPanel::show(...). - O
main.rsso instancia e chama a viewport. - A area da viewport respeita:
- largura dockada do
Inspector - largura dockada do
Hierarchy - altura reservada do
Projectno rodape
- largura dockada do
Arquivos relevantes:
src/viewport.rssrc/main.rssrc/hierarchy.rs(getters de largura dockada)
No editor, mantenha estados para:
GizmoMode:Translate,Rotate,ScaleGizmoOrientation:Global,Local- Camera/projecao: perspectiva/ortografica
Exemplo de estado:
struct ViewportState {
gizmo_mode: GizmoMode,
gizmo_orientation: GizmoOrientation,
model_matrix: Mat4,
}Eguizmo usa mint nos metodos publicos.
Com glam + feature mint, a conversao fica direta:
let mint_mat = mat4.to_cols_array_2d().into();
let mat4_back = Mat4::from(mint_mat);- Gizmo nao aparece:
- confirme que
viewport_recte valido (nao zero) - confirme que view/projection estao corretas
- confirme que o gizmo esta sendo chamado dentro de uma area visivel do
egui
- Interacao do mouse nao funciona:
- evite sobrepor widgets clicaveis em cima do viewport
- confira se o
uiusado nogizmo.interact(ui)e o da area correta
- Transform "estranha":
- confira handness/sistema de coordenadas da camera
- teste primeiro com
Mat4::IDENTITY
- calcular
viewport_rect - montar
vieweprojection - criar
Gizmocom modo/orientacao atuais - aplicar
result.transform()no objeto selecionado - renderizar cena usando a nova transform
egui/eframe:0.33.3egui-gizmo(forkEguizmo): branchmainglam:0.31com featuremint