cleaned instance rendering

master
hheik 2023-03-31 21:27:05 +03:00
parent baf64181ec
commit 2b0ba06bf1
2 changed files with 188 additions and 167 deletions

View File

@ -8,7 +8,7 @@ use crate::{
pokemon::*, pokemon::*,
}; };
use super::ui::UiAssets; use super::ui::{EguiAsset, UiAssets};
pub struct InspectorPlugin; pub struct InspectorPlugin;
@ -42,19 +42,7 @@ pub struct PokemonInstance {
} }
fn test_init(mut inspector: ResMut<Inspector>, pokemon_database: Res<Database<Pokemon>>) { fn test_init(mut inspector: ResMut<Inspector>, pokemon_database: Res<Database<Pokemon>>) {
for name in vec![ for name in vec!["baltoy"].iter() {
"baltoy",
"claydol",
"regirock",
"flygon",
"shuckle",
"swampert",
"forretress",
"shedinja",
"blissey",
]
.iter()
{
inspector.enemies.push(PokemonInstance { inspector.enemies.push(PokemonInstance {
pokemon: pokemon_database.map.get(*name).unwrap().clone(), pokemon: pokemon_database.map.get(*name).unwrap().clone(),
ivs: { ivs: {
@ -77,6 +65,29 @@ fn test_init(mut inspector: ResMut<Inspector>, pokemon_database: Res<Database<Po
..default() ..default()
}); });
} }
for name in vec!["seadra", "sceptile", "ampharos", "shedinja"].iter() {
inspector.allies.push(PokemonInstance {
pokemon: pokemon_database.map.get(*name).unwrap().clone(),
ivs: {
let mut result = HashMap::new();
for stat in BaseStat::all().iter() {
result.insert(
*stat,
match stat {
BaseStat::Hp => 31,
BaseStat::Attack => 27,
BaseStat::Defense => 26,
BaseStat::SpecialAttack => 0,
BaseStat::SpecialDefense => 21,
BaseStat::Speed => 15,
},
);
}
result
},
..default()
});
}
} }
fn state_changed( fn state_changed(
@ -99,7 +110,7 @@ fn state_changed(
let weak = handle.clone_weak(); let weak = handle.clone_weak();
ui_assets ui_assets
.sprite_map .sprite_map
.insert(pokemon.key(), (handle, contexts.add_image(weak))); .insert(pokemon.key(), EguiAsset(handle, contexts.add_image(weak)));
} }
} }
} }

View File

@ -5,9 +5,11 @@ use std::collections::HashMap;
use crate::pokemon::*; use crate::pokemon::*;
use super::inspector::Inspector; use super::inspector::{Inspector, PokemonInstance};
const BAR_HEIGHT: f32 = 12.0; const BAR_HEIGHT: f32 = 12.0;
const SPRITE_SIZE: f32 = 128.0;
const SPRITE_PADDING: f32 = 32.0;
const BASE_STAT_WIDTH_MULT: f32 = 0.8; const BASE_STAT_WIDTH_MULT: f32 = 0.8;
const IV_WIDTH_MULT: f32 = 4.0; const IV_WIDTH_MULT: f32 = 4.0;
// const EV_WIDTH_MULT: f32 = 1.0; // const EV_WIDTH_MULT: f32 = 1.0;
@ -51,45 +53,66 @@ impl Plugin for UiPlugin {
} }
} }
#[derive(Default)]
pub struct EguiAsset(pub Handle<Image>, pub egui::TextureId);
#[derive(Resource, Default)] #[derive(Resource, Default)]
pub struct UiAssets { pub struct UiAssets {
pub bar_handle: Handle<Image>, pub bar_handle: EguiAsset,
pub sprite_map: HashMap<String, (Handle<Image>, egui::TextureId)>, pub sprite_map: HashMap<String, EguiAsset>,
} }
fn load_assets(mut ui_assets: ResMut<UiAssets>, assets: Res<AssetServer>) { fn load_assets(
ui_assets.bar_handle = assets.load("ui/bar.png");
}
fn ui_system(
mut contexts: EguiContexts, mut contexts: EguiContexts,
inspector: Res<Inspector>, mut ui_assets: ResMut<UiAssets>,
ui_assets: Res<UiAssets>, assets: Res<AssetServer>,
mut rendered_texture_id: Local<egui::TextureId>,
mut is_initialized: Local<bool>,
) { ) {
if !*is_initialized { ui_assets.bar_handle = load_egui_asset(&mut contexts, &assets);
*is_initialized = true;
*rendered_texture_id = contexts.add_image(ui_assets.bar_handle.clone_weak());
} }
fn ui_system(mut contexts: EguiContexts, inspector: Res<Inspector>, ui_assets: Res<UiAssets>) {
egui::CentralPanel::default().show(contexts.ctx_mut(), |ui| { egui::CentralPanel::default().show(contexts.ctx_mut(), |ui| {
let sprite_size = egui::Vec2::new(128., 128.);
egui::ScrollArea::vertical().show(ui, |ui| { egui::ScrollArea::vertical().show(ui, |ui| {
for instance in inspector.enemies.iter().chain(inspector.allies.iter()) { ui.heading("Enemy team");
for instance in inspector.enemies.iter() {
ui.add_space(8.);
render_pokemon_instance(ui, &ui_assets, instance);
ui.add_space(8.);
}
ui.separator();
ui.heading("Player team");
for instance in inspector.allies.iter() {
ui.add_space(8.);
render_pokemon_instance(ui, &ui_assets, instance);
ui.add_space(8.);
}
});
});
}
fn load_egui_asset(contexts: &mut EguiContexts, assets: &Res<AssetServer>) -> EguiAsset {
let handle = assets.load("ui/bar.png");
let egui_id = contexts.add_image(handle.clone_weak());
EguiAsset(handle, egui_id)
}
fn render_pokemon_instance(
ui: &mut egui::Ui,
ui_assets: &Res<UiAssets>,
instance: &PokemonInstance,
) {
let sprite_size = egui::Vec2::new(SPRITE_SIZE, SPRITE_SIZE);
let pokemon = instance.pokemon.clone(); let pokemon = instance.pokemon.clone();
let nature = instance.nature.clone(); let nature = instance.nature.clone();
ui.horizontal(|ui| { ui.horizontal(|ui| {
ui.horizontal(|ui| { ui.horizontal(|ui| {
ui.set_min_width(sprite_size.x + 32.); ui.set_min_width(sprite_size.x + SPRITE_PADDING);
ui.set_max_width(sprite_size.x + 32.); ui.set_max_width(sprite_size.x + SPRITE_PADDING);
// Name // Name
ui.label( ui.label(egui::RichText::new(&pokemon.full_name).color(egui::Color32::LIGHT_GRAY));
egui::RichText::new(&pokemon.full_name)
.color(egui::Color32::LIGHT_GRAY),
);
// Types // Types
ui.label(format!( ui.label(format!(
@ -111,9 +134,6 @@ fn ui_system(
3 => { 3 => {
ui.label(egui::RichText::new("IV")); ui.label(egui::RichText::new("IV"));
} }
4 => {
ui.label(egui::RichText::new("IV range"));
}
_ => (), _ => (),
} }
}); });
@ -126,14 +146,14 @@ fn ui_system(
ui.horizontal(|ui| { ui.horizontal(|ui| {
ui.set_min_size(sprite_size); ui.set_min_size(sprite_size);
ui.set_max_size(sprite_size); ui.set_max_size(sprite_size);
if let Some((_, rendered_texture_id)) = if let Some(EguiAsset(_, rendered_texture_id)) =
ui_assets.sprite_map.get(&pokemon.key()) ui_assets.sprite_map.get(&pokemon.key())
{ {
ui.add(egui::Image::new(*rendered_texture_id, sprite_size)); ui.add(egui::Image::new(*rendered_texture_id, sprite_size));
} }
}); });
ui.add_space(32.); ui.add_space(SPRITE_PADDING);
ui.vertical(|ui| { ui.vertical(|ui| {
for stat in BaseStat::all() { for stat in BaseStat::all() {
@ -158,10 +178,8 @@ fn ui_system(
let bar_length = base_value as f32 * BASE_STAT_WIDTH_MULT; let bar_length = base_value as f32 * BASE_STAT_WIDTH_MULT;
let color = base_stat_color(base_value); let color = base_stat_color(base_value);
let image = egui::Image::new( let image =
*rendered_texture_id, egui::Image::new(ui_assets.bar_handle.1, [bar_length, BAR_HEIGHT])
[bar_length, BAR_HEIGHT],
)
.tint(color); .tint(color);
ui.add(image); ui.add(image);
}); });
@ -183,10 +201,7 @@ fn ui_system(
ui.set_width(*width); ui.set_width(*width);
} }
if let Some(iv) = instance.ivs.get(&stat) { if let Some(iv) = instance.ivs.get(&stat) {
ui.label( ui.label(egui::RichText::new(format!("{iv}")).color(iv_color(*iv)));
egui::RichText::new(format!("{iv}"))
.color(iv_color(*iv)),
);
} else { } else {
ui.label("-"); ui.label("-");
} }
@ -208,7 +223,7 @@ fn ui_system(
// Bar // Bar
ui.add( ui.add(
egui::Image::new( egui::Image::new(
*rendered_texture_id, ui_assets.bar_handle.1,
[bar_length, BAR_HEIGHT], [bar_length, BAR_HEIGHT],
) )
.tint(color), .tint(color),
@ -216,7 +231,7 @@ fn ui_system(
// Track // Track
ui.add( ui.add(
egui::Image::new( egui::Image::new(
*rendered_texture_id, ui_assets.bar_handle.1,
[track_length, BAR_HEIGHT], [track_length, BAR_HEIGHT],
) )
.tint(egui::Color32::from_rgb(64, 64, 64)), .tint(egui::Color32::from_rgb(64, 64, 64)),
@ -228,11 +243,6 @@ fn ui_system(
} }
}); });
}); });
ui.separator();
}
});
});
} }
fn nature_color(stat: BaseStat, nature: Option<&Nature>) -> egui::Color32 { fn nature_color(stat: BaseStat, nature: Option<&Nature>) -> egui::Color32 {