From 3bb12fdcee437e76201b093c9ec18787419bd32b Mon Sep 17 00:00:00 2001 From: gered Date: Fri, 26 May 2023 12:04:02 -0400 Subject: [PATCH] update imgui example with image widgets showing slime colors/bitmaps --- examples/imgui_integration/src/context.rs | 25 ++++++++++++++++----- examples/imgui_integration/src/entities.rs | 12 +++++----- examples/imgui_integration/src/main.rs | 26 +++++++++++++++------- 3 files changed, 44 insertions(+), 19 deletions(-) diff --git a/examples/imgui_integration/src/context.rs b/examples/imgui_integration/src/context.rs index 8347125..b662cb3 100644 --- a/examples/imgui_integration/src/context.rs +++ b/examples/imgui_integration/src/context.rs @@ -1,12 +1,15 @@ -use crate::entities::{AnimationDef, EntityActivity, Event}; -use crate::support::{load_bitmap_atlas_autogrid, load_font, load_palette}; -use crate::tilemap::TileMap; -use anyhow::Result; -use ggdt::prelude::*; use std::collections::HashMap; use std::path::Path; use std::rc::Rc; +use anyhow::Result; + +use ggdt::prelude::*; + +use crate::entities::{AnimationDef, EntityActivity, Event, SlimeColor}; +use crate::support::{load_bitmap_atlas_autogrid, load_font, load_palette}; +use crate::tilemap::TileMap; + pub struct CoreContext { pub delta: f32, pub camera_x: i32, @@ -25,6 +28,7 @@ pub struct CoreContext { pub tilemap: TileMap, pub slime_activity_states: Rc>>, pub sprite_render_list: Vec<(EntityId, Vector2, RgbaBlitMethod)>, + pub slime_texture_id_map: HashMap, } impl CoreState for CoreContext { @@ -103,7 +107,15 @@ impl GameContext { let component_systems = ComponentSystems::new(); let event_publisher = EventPublisher::new(); let event_listeners = EventListeners::new(); - let imgui = ggdt_imgui::ImGui::new(); + let mut imgui = ggdt_imgui::ImGui::new(); + + let mut slime_texture_id_map = HashMap::new(); + slime_texture_id_map + .insert(SlimeColor::Green, imgui.texture_map_mut().insert(green_slime.clone_tile(0).unwrap())); + slime_texture_id_map + .insert(SlimeColor::Blue, imgui.texture_map_mut().insert(blue_slime.clone_tile(0).unwrap())); + slime_texture_id_map + .insert(SlimeColor::Orange, imgui.texture_map_mut().insert(orange_slime.clone_tile(0).unwrap())); let slime_activity_states = HashMap::from([ (EntityActivity::Idle, Rc::new(AnimationDef::new(&[1, 2], true, 1.0, Some(3)))), @@ -129,6 +141,7 @@ impl GameContext { tilemap, slime_activity_states: Rc::new(slime_activity_states), sprite_render_list: Vec::new(), + slime_texture_id_map, }, support: SupportContext { component_systems, event_listeners, imgui }, }) diff --git a/examples/imgui_integration/src/entities.rs b/examples/imgui_integration/src/entities.rs index 71aeb6f..9928abd 100644 --- a/examples/imgui_integration/src/entities.rs +++ b/examples/imgui_integration/src/entities.rs @@ -1,9 +1,11 @@ -use crate::context::{CoreContext, GameContext}; -use crate::tilemap::TileMap; -use ggdt::prelude::*; use std::collections::HashMap; use std::rc::Rc; +use ggdt::prelude::*; + +use crate::context::{CoreContext, GameContext}; +use crate::tilemap::TileMap; + pub const FRICTION: f32 = 0.5; pub const DEFAULT_PUSH_STRENGTH: f32 = 0.5; pub const DEFAULT_PUSH_DISSIPATION: f32 = 0.5; @@ -211,7 +213,7 @@ impl RandomlyWalksAround { } } -pub struct Slime; +pub struct Slime(pub SlimeColor); pub struct Sprite { pub atlas: Rc>, @@ -738,7 +740,7 @@ pub fn new_slime_entity( let animate_by_activity = AnimateByActivity(context.slime_activity_states.clone()); let animation = AnimationInstance::from(animate_by_activity.0.get(&activity).unwrap().clone()); - context.entities.add_component(id, Slime); + context.entities.add_component(id, Slime(color)); context.entities.add_component(id, Position(Vector2::new(x as f32, y as f32))); context.entities.add_component(id, Velocity(Vector2::ZERO)); context.entities.add_component(id, Forces::new()); diff --git a/examples/imgui_integration/src/main.rs b/examples/imgui_integration/src/main.rs index 8591d4f..6d79847 100644 --- a/examples/imgui_integration/src/main.rs +++ b/examples/imgui_integration/src/main.rs @@ -1,15 +1,16 @@ -mod context; -mod entities; -mod support; -mod tilemap; - use anyhow::Result; +use ggdt::prelude::*; +use ggdt_imgui::UiSupport; + use crate::context::GameContext; use crate::entities::{Forces, Position, Slime}; use crate::tilemap::{TILE_HEIGHT, TILE_WIDTH}; -use ggdt::prelude::*; -use ggdt_imgui::UiSupport; + +mod context; +mod entities; +mod support; +mod tilemap; #[derive(Default)] pub struct DemoState { @@ -27,17 +28,26 @@ impl AppState for DemoState { let ui = context.support.imgui.new_frame(&context.core.system.res.video); ui.window("Entities") .position([10.0, 10.0], imgui::Condition::FirstUseEver) - .size([200.0, 200.0], imgui::Condition::FirstUseEver) + .size([240.0, 200.0], imgui::Condition::FirstUseEver) .build(|| { ui.text(format!("Camera: {}, {}", context.core.camera_x, context.core.camera_y)); ui.separator(); ui.text_colored([1.0, 1.0, 0.0, 1.0], "Slimes"); let mut positions = context.core.entities.components_mut::().unwrap(); + let mut slime_types = context.core.entities.components::(); for (slime, _) in context.core.entities.components::().unwrap().iter() { let position = positions.get(slime).unwrap(); + let slime_type = slime_types.get(slime).unwrap(); ui.text(format!("{:2} @ {:3.0},{:3.0}", *slime, position.0.x, position.0.y)); + if let Some(slime_type_texture_id) = context.core.slime_texture_id_map.get(&slime_type.0) { + ui.same_line(); + ui.invisible_button("Slime Type", [16.0, 16.0]); + let draw_list = ui.get_window_draw_list(); + draw_list.add_image(*slime_type_texture_id, ui.item_rect_min(), ui.item_rect_max()).build(); + } + ui.same_line(); let clicked = { let _id = ui.push_id_ptr(slime);