Skip to content

Commit 4151549

Browse files
committed
progress with UI
1 parent 18c6b08 commit 4151549

16 files changed

Lines changed: 406 additions & 105 deletions

File tree

crates/bevy_animation_graph/src/core/ragdoll/definition.rs

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use bevy::{
22
asset::Asset,
33
math::{Isometry3d, Vec3},
44
reflect::Reflect,
5+
utils::default,
56
};
67
use serde::{Deserialize, Serialize};
78
use uuid::Uuid;
@@ -39,7 +40,20 @@ pub struct Body {
3940
pub default_mode: BodyMode,
4041
}
4142

42-
#[derive(Reflect, Debug, Clone, Serialize, Deserialize)]
43+
impl Body {
44+
pub fn new() -> Self {
45+
Self {
46+
id: BodyId {
47+
uuid: Uuid::new_v4(),
48+
},
49+
isometry: default(),
50+
colliders: default(),
51+
default_mode: BodyMode::Kinematic,
52+
}
53+
}
54+
}
55+
56+
#[derive(Reflect, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
4357
pub enum BodyMode {
4458
Kinematic,
4559
Dynamic,
@@ -96,17 +110,35 @@ pub struct AngleLimit {
96110
pub max: f32,
97111
}
98112

99-
#[derive(Reflect, Debug, Clone, Copy, Serialize, Deserialize, Hash, PartialEq, Eq)]
113+
#[derive(Reflect, Clone, Copy, Serialize, Deserialize, Hash, PartialEq, Eq)]
100114
pub struct BodyId {
101115
uuid: Uuid,
102116
}
103117

104-
#[derive(Reflect, Debug, Clone, Copy, Serialize, Deserialize, Hash, PartialEq, Eq)]
118+
impl std::fmt::Debug for BodyId {
119+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
120+
self.uuid.fmt(f)
121+
}
122+
}
123+
124+
#[derive(Reflect, Clone, Copy, Serialize, Deserialize, Hash, PartialEq, Eq)]
105125
pub struct ColliderId {
106126
uuid: Uuid,
107127
}
108128

109-
#[derive(Reflect, Debug, Clone, Copy, Serialize, Deserialize, Hash, PartialEq, Eq)]
129+
impl std::fmt::Debug for ColliderId {
130+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
131+
self.uuid.fmt(f)
132+
}
133+
}
134+
135+
#[derive(Reflect, Clone, Copy, Serialize, Deserialize, Hash, PartialEq, Eq)]
110136
pub struct JointId {
111137
uuid: Uuid,
112138
}
139+
140+
impl std::fmt::Debug for JointId {
141+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
142+
self.uuid.fmt(f)
143+
}
144+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
use egui::{ImageSource, include_image};
2+
3+
pub const JOINT: ImageSource<'_> = include_image!("./icons/joint.svg");
4+
pub const BOX: ImageSource<'_> = include_image!("./icons/box.svg");
5+
pub const BONE: ImageSource<'_> = include_image!("./icons/bone.svg");
File renamed without changes.
File renamed without changes.
File renamed without changes.

crates/bevy_animation_graph_editor/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ mod egui_fsm;
22
mod egui_nodes;
33
mod fsm_show;
44
mod graph_show;
5+
mod icons;
56
mod scanner;
67
mod tree;
78
mod ui;

crates/bevy_animation_graph_editor/src/tree.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use bevy_animation_graph::core::{
66
};
77
use egui::Sense;
88

9-
use crate::ui::utils::collapsing::Collapser;
9+
use crate::{icons, ui::utils::collapsing::Collapser};
1010

1111
pub struct Tree<I, L>(pub Vec<TreeInternal<I, L>>);
1212
impl<I, T> Default for Tree<I, T> {
@@ -416,9 +416,9 @@ impl TreeRenderer<RagdollNode, RagdollNode, RagdollResponse> for RagdollTreeRend
416416
let response = ui
417417
.horizontal(|ui| {
418418
let image = match data {
419-
RagdollNode::Body(_) => egui::include_image!("./bone.svg"),
420-
RagdollNode::Collider(_) => egui::include_image!("./box.svg"),
421-
RagdollNode::Joint(_) => egui::include_image!("./joint.svg"),
419+
RagdollNode::Body(_) => icons::BONE,
420+
RagdollNode::Collider(_) => icons::BOX,
421+
RagdollNode::Joint(_) => icons::JOINT,
422422
};
423423
let color = ui.visuals().text_color();
424424
ui.add(egui::Image::new(image).tint(color).sense(Sense::click()))
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
use bevy::ecs::world::World;
2+
use bevy_animation_graph::core::ragdoll::definition::{Body, BodyMode};
3+
use egui::Widget;
4+
5+
use crate::ui::{core::EditorWindowContext, generic_widgets::isometry3d::Isometry3dWidget};
6+
7+
pub struct BodyInspector<'a, 'b> {
8+
pub world: &'a mut World,
9+
pub ctx: &'a mut EditorWindowContext<'b>,
10+
pub body: &'a mut Body,
11+
}
12+
13+
impl Widget for BodyInspector<'_, '_> {
14+
fn ui(self, ui: &mut egui::Ui) -> egui::Response {
15+
let response = egui::Grid::new("ragdoll body inspector").show(ui, |ui| {
16+
ui.label("ID");
17+
ui.label(format!("{:?}", self.body.id));
18+
ui.end_row();
19+
20+
let isometry_response = ui.add(
21+
Isometry3dWidget::new_salted(&mut self.body.isometry, "isometry")
22+
.with_step_size(0.01)
23+
.with_flatten_grid(true),
24+
);
25+
26+
ui.label("Body mode:");
27+
let body_mode_response = egui::ComboBox::from_id_salt("body mode")
28+
.selected_text(match self.body.default_mode {
29+
BodyMode::Kinematic => "Kinematic",
30+
BodyMode::Dynamic => "Dynamic",
31+
})
32+
.show_ui(ui, |ui| {
33+
ui.selectable_value(
34+
&mut self.body.default_mode,
35+
BodyMode::Kinematic,
36+
"Kinematic",
37+
);
38+
ui.selectable_value(&mut self.body.default_mode, BodyMode::Dynamic, "Dynamic");
39+
})
40+
.response;
41+
42+
isometry_response | body_mode_response
43+
});
44+
45+
response.inner
46+
}
47+
}

crates/bevy_animation_graph_editor/src/ui/editor_windows/ragdoll_editor/body_tree.rs

Lines changed: 24 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ use bevy::{
44
};
55
use bevy_animation_graph::core::ragdoll::definition::Ragdoll;
66

7-
use crate::ui::core::EditorWindowContext;
7+
use crate::{
8+
tree::{RagdollTreeRenderer, Tree, TreeResult},
9+
ui::{core::EditorWindowContext, editor_windows::ragdoll_editor::RagdollEditorAction},
10+
};
811

912
pub struct BodyTree<'a, 'b> {
1013
pub ragdoll: Handle<Ragdoll>,
@@ -16,51 +19,28 @@ impl BodyTree<'_, '_> {
1619
pub fn draw(self, ui: &mut egui::Ui) {
1720
self.world
1821
.resource_scope::<Assets<Ragdoll>, _>(|_world, ragdoll_assets| {
19-
let Some(_ragdoll) = ragdoll_assets.get(&self.ragdoll) else {
22+
let Some(ragdoll) = ragdoll_assets.get(&self.ragdoll) else {
2023
return;
2124
};
25+
26+
// Tree, assemble!
27+
let response =
28+
Tree::ragdoll_tree(ragdoll).picker_selector(ui, RagdollTreeRenderer {});
29+
30+
match response {
31+
TreeResult::Leaf(_, response) | TreeResult::Node(_, response) => {
32+
// self.hovered = response.hovered;
33+
// if let Some(clicked) = response.clicked {
34+
// self.selected = Some(clicked);
35+
// self.edit_buffers.clear();
36+
// }
37+
if let Some(clicked_node) = response.clicked {
38+
self.ctx
39+
.window_action(RagdollEditorAction::SelectNode(clicked_node));
40+
}
41+
}
42+
TreeResult::None => {}
43+
}
2244
});
2345
}
2446
}
25-
26-
// pub fn draw_tree_view(
27-
// &mut self,
28-
// ui: &mut egui::Ui,
29-
// world: &mut World,
30-
// _ctx: &mut EditorWindowContext,
31-
// ) {
32-
// let Some(target) = &self.target else {
33-
// ui.centered_and_justified(|ui| {
34-
// ui.label("No target selected");
35-
// });
36-
// return;
37-
// };
38-
//
39-
// egui::ScrollArea::both().show(ui, |ui| {
40-
// world.resource_scope::<Assets<SkeletonColliders>, _>(|world, skeleton_colliders| {
41-
// world.resource_scope::<Assets<Skeleton>, _>(|_, skeletons| {
42-
// let Some(skeleton_colliders) = skeleton_colliders.get(target) else {
43-
// return;
44-
// };
45-
// let Some(skeleton) = skeletons.get(&skeleton_colliders.skeleton) else {
46-
// return;
47-
// };
48-
//
49-
// // Tree, assemble!
50-
// let response =
51-
// Tree::skeleton_tree(skeleton).picker_selector(ui, SkeletonTreeRenderer {});
52-
//
53-
// match response {
54-
// TreeResult::Leaf(_, response) | TreeResult::Node(_, response) => {
55-
// self.hovered = response.hovered;
56-
// if let Some(clicked) = response.clicked {
57-
// self.selected = Some(clicked);
58-
// self.edit_buffers.clear();
59-
// }
60-
// }
61-
// _ => {}
62-
// };
63-
// })
64-
// });
65-
// });
66-
// }

0 commit comments

Comments
 (0)