summaryrefslogtreecommitdiff
path: root/engine/src/ui
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/ui')
-rw-r--r--engine/src/ui/dear_imgui.rs13
-rw-r--r--engine/src/ui/view/world.rs182
2 files changed, 99 insertions, 96 deletions
diff --git a/engine/src/ui/dear_imgui.rs b/engine/src/ui/dear_imgui.rs
index 0047394..b3a102b 100644
--- a/engine/src/ui/dear_imgui.rs
+++ b/engine/src/ui/dear_imgui.rs
@@ -9,7 +9,6 @@ use dear_imgui_rs::{
MouseButton as ImguiMouseButton,
};
use ecs::component::local::Local;
-use ecs::component::Component;
use ecs::error::Context as _;
use ecs::event::component::{Changed, EventMatchExt};
use ecs::pair::Pair;
@@ -56,6 +55,7 @@ use crate::rendering::shader::{
};
use crate::rendering::{
AssetOrValue,
+ BackendProperties as RenderingBackendProperties,
Command as RenderingCommand,
DrawMeshOptions,
DrawProperties,
@@ -211,7 +211,7 @@ fn handle_window_changed(
let Some(event_match) = observe
.iter()
- .find(|event_match| event_match.get_entity().has_component(TargetWindow::id()))
+ .find(|event_match| event_match.get_entity().has_component::<TargetWindow>())
else {
return;
};
@@ -244,6 +244,7 @@ fn update(
mut assets: Single<Assets>,
mut render_passes: Single<RenderPasses>,
shader_context: Single<ShaderContext>,
+ rendering_backend_properties: Single<RenderingBackendProperties>,
keyboard: Single<Keyboard>,
mouse: Single<Mouse>,
mouse_buttons: Single<MouseButtons>,
@@ -261,6 +262,10 @@ fn update(
let mouse = mouse.get()?;
let mouse_buttons = mouse_buttons.get()?;
+ let Ok(rendering_backend_properties) = rendering_backend_properties.get() else {
+ return Ok(());
+ };
+
let Some((window, window_surface)) = target_window_query.iter().next() else {
return Ok(());
};
@@ -302,6 +307,7 @@ fn update(
context,
render_passes,
shader_context,
+ rendering_backend_properties,
window_surface.id,
shader_asset.clone(),
mesh_obj_id,
@@ -479,6 +485,7 @@ fn add_drawing_render_pass(
context: &mut Context,
render_passes: &mut RenderPasses,
shader_context: &ShaderContext,
+ rendering_backend_properties: &RenderingBackendProperties,
window_surface_id: SurfaceId,
shader_asset: AssetHandle<ShaderModuleSource>,
mesh_obj_id: RenderingObjectId,
@@ -507,7 +514,7 @@ fn add_drawing_render_pass(
let shader_cursor = ShaderCursor::new(
shader_program
- .reflection(0)
+ .reflection(rendering_backend_properties.shader_target_id)
.unwrap()
.global_params_var_layout()
.unwrap(),
diff --git a/engine/src/ui/view/world.rs b/engine/src/ui/view/world.rs
index 411acd7..bf92859 100644
--- a/engine/src/ui/view/world.rs
+++ b/engine/src/ui/view/world.rs
@@ -4,15 +4,15 @@ use std::io::Cursor;
use std::ops::{Deref, DerefMut};
use ecs::error::Context;
+use ecs::phase::Phase;
+use ecs::query::term::{With, Without};
+use ecs::sole::Is as IsSole;
+use ecs::system::Function as SystemFunction;
use crate::color::{Rgb, Rgba};
use crate::ecs::actions::Actions;
use crate::ecs::component::local::Local;
-use crate::ecs::component::{
- Handle as ComponentHandle,
- Info as ComponentInfo,
- Parts as ComponentParts,
-};
+use crate::ecs::component::{Info as ComponentInfo, Parts as ComponentParts};
use crate::ecs::entity::{Handle as EntityHandle, Name as EntityName};
use crate::ecs::sole::Single;
use crate::ecs::uid::Uid;
@@ -47,7 +47,13 @@ pub struct State
}
pub fn show(
- query: Query<()>,
+ non_sole_query: Query<(
+ Without<ComponentInfo>,
+ Without<Phase>,
+ Without<SystemFunction>,
+ Without<IsSole>,
+ )>,
+ sole_query: Query<(With<IsSole>,)>,
mut dear_imgui_context: Single<DearImguiContext>,
mut state: Local<State>,
world: &World,
@@ -84,7 +90,18 @@ pub fn show(
frame.spacing();
frame.spacing();
- for ent_handle in &query.into_flexible_query() {
+ for ent_handle in &non_sole_query.into_flexible_query() {
+ create_entity_widgets(
+ frame,
+ popup_state,
+ icon_textures,
+ &ent_handle,
+ world,
+ &mut actions,
+ );
+ }
+
+ for ent_handle in &sole_query.into_flexible_query() {
create_entity_widgets(
frame,
popup_state,
@@ -169,18 +186,6 @@ fn create_entity_widgets(
actions: &mut Actions,
)
{
- if ent_handle.component_ids().next().is_some()
- && !ent_handle.component_ids().any(|comp_id| {
- world.get_entity(comp_id).is_some_and(|comp_ent| {
- comp_ent
- .get::<ComponentInfo>()
- .is_some_and(|comp_info| comp_info.type_reflection.is_some())
- })
- })
- {
- return;
- }
-
let ent_title = create_entity_title(ent_handle);
let mut is_open = false;
@@ -266,14 +271,6 @@ fn create_component_widgets(
return;
};
- let Some(component_type) = component_info.type_reflection else {
- return;
- };
-
- let Some(mut component) = ent_handle.get_any_by_id_mut(component_id) else {
- unreachable!();
- };
-
{
let _color_token = frame.push_style_color(
dear_imgui_bindings::StyleColor::Button,
@@ -301,42 +298,43 @@ fn create_component_widgets(
frame.same_line();
- let mut component_changed = false;
+ frame.text(component_info.name);
- create_item_title_widget(
- frame,
- component_info.name,
- &ItemType::Reflected(component_type),
- None,
- );
+ if let Some(component_type) = component_info.type_reflection {
+ let item_type = ItemType::Reflected(component_type);
- let item_type = ItemType::Reflected(component_type);
+ let _token = item_type.indent_or_same_line(frame);
- let _token = item_type.indent_or_same_line(frame);
+ let Some(mut component) = ent_handle.get_any_by_id_mut(component_id) else {
+ unreachable!();
+ };
- add_item_to_frame(
- frame,
- ItemRef::Mutable(&mut *component),
- &mut component_changed,
- ItemInfo {
- title: component_info.name,
- tag: &format!(
- "world_view_entity_{}_component_{}",
- ent_handle.uid(),
- component_info.name,
- ),
- type_name: None,
- ty: item_type,
- is_read_only: false,
- },
- &[],
- );
+ let mut component_changed = false;
- frame.spacing();
+ add_item_to_frame(
+ frame,
+ ItemRef::Mutable(&mut *component),
+ &mut component_changed,
+ ItemInfo {
+ title: component_info.name,
+ tag: &format!(
+ "world_view_entity_{}_component_{}",
+ ent_handle.uid(),
+ component_info.name,
+ ),
+ type_name: None,
+ ty: item_type,
+ is_read_only: false,
+ },
+ &[],
+ );
- if component_changed {
- component.set_changed();
+ if component_changed {
+ component.set_changed();
+ }
}
+
+ frame.spacing();
}
fn create_pair_component_widgets(
@@ -375,22 +373,8 @@ fn create_pair_component_widgets(
frame.same_line();
- let relation_comp_info_or_ent_name =
- get_comp_info_or_ent_name(world, pair_id.relation());
-
- let relation_name: Cow<'_, str> = match &relation_comp_info_or_ent_name {
- Some(Either::A(comp_info)) => comp_info.name.into(),
- Some(Either::B(ent_name)) => format!("🌐 {}", ent_name.name).into(),
- None => format!("<unnamed> {}", pair_id.relation()).into(),
- };
-
- let target_comp_info_or_ent_name = get_comp_info_or_ent_name(world, pair_id.target());
-
- let target_name: Cow<'_, str> = match &target_comp_info_or_ent_name {
- Some(Either::A(comp_info)) => comp_info.name.into(),
- Some(Either::B(ent_name)) => format!("🌐 {}", ent_name.name).into(),
- None => format!("<unnamed> {}", pair_id.target()).into(),
- };
+ let relation_name = get_comp_name_or_ent_name(world, pair_id.relation());
+ let target_name = get_comp_name_or_ent_name(world, pair_id.target());
// TODO: Make relation & target ids editable
@@ -402,15 +386,14 @@ fn create_pair_component_widgets(
let pair_data_ty_id = (*pair_data).type_id();
- let Some(pair_data_comp_info) = [
- &relation_comp_info_or_ent_name,
- &target_comp_info_or_ent_name,
- ]
- .map(Option::as_ref)
- .map(|item| item.and_then(Either::as_a))
- .into_iter()
- .flatten()
- .find(|comp_info| comp_info.ty_id == pair_data_ty_id) else {
+ let pair_member_comp_infos = [pair_id.relation(), pair_id.target()]
+ .map(|member_id| world.get_entity(member_id)?.get::<ComponentInfo>());
+
+ let Some(pair_data_comp_info) = pair_member_comp_infos
+ .into_iter()
+ .filter_map(std::convert::identity)
+ .find(|comp_info| comp_info.ty_id == pair_data_ty_id)
+ else {
return;
};
@@ -465,22 +448,21 @@ fn create_pair_component_widgets(
// pairs as event targets
}
-fn get_comp_info_or_ent_name(
- world: &World,
- id: Uid,
-) -> Option<Either<ComponentHandle<'_, ComponentInfo>, ComponentHandle<'_, EntityName>>>
+fn get_comp_name_or_ent_name(world: &World, id: Uid) -> Cow<'static, str>
{
- let ent = world.get_entity(id)?;
+ let Some(ent) = world.get_entity(id) else {
+ return format!("<unnamed> {id}").into();
+ };
if let Some(component_info) = ent.get::<ComponentInfo>() {
- return Some(Either::A(component_info));
+ return component_info.name.into();
}
if let Some(entity_name) = ent.get::<EntityName>() {
- return Some(Either::B(entity_name));
+ return format!("🌐 {}", entity_name.name).into();
}
- None
+ format!("🌐 <unnamed> {id}").into()
}
fn create_add_component_button_widget(
@@ -506,10 +488,24 @@ fn create_add_component_button_widget(
[90.0, 162.0, 51.0, 255.0].map(|num| num / 255.0),
);
- let is_button_clicked = frame.button(format!(
- "+##add_component_to_entity_button_{}",
- ent_handle.uid()
- ));
+ let ent_is_sole = ent_handle.has_component::<IsSole>();
+
+ let is_button_clicked = {
+ let _disabled_token = frame.begin_disabled_with_cond(ent_is_sole);
+
+ frame.button(format!(
+ "+##add_component_to_entity_button_{}",
+ ent_handle.uid()
+ ))
+ };
+
+ if ent_is_sole {
+ if frame.is_item_hovered_with_flags(
+ dear_imgui_bindings::ItemHoveredFlags::ALLOW_WHEN_DISABLED,
+ ) {
+ frame.tooltip_text("Cannot add a component to the entity of a sole");
+ }
+ }
if is_button_clicked {
enter_add_component_popup_state(popup_state, ent_handle, ent_title, world);