cleaned instance rendering
parent
baf64181ec
commit
2b0ba06bf1
|
|
@ -8,7 +8,7 @@ use crate::{
|
|||
pokemon::*,
|
||||
};
|
||||
|
||||
use super::ui::UiAssets;
|
||||
use super::ui::{EguiAsset, UiAssets};
|
||||
|
||||
pub struct InspectorPlugin;
|
||||
|
||||
|
|
@ -42,19 +42,7 @@ pub struct PokemonInstance {
|
|||
}
|
||||
|
||||
fn test_init(mut inspector: ResMut<Inspector>, pokemon_database: Res<Database<Pokemon>>) {
|
||||
for name in vec![
|
||||
"baltoy",
|
||||
"claydol",
|
||||
"regirock",
|
||||
"flygon",
|
||||
"shuckle",
|
||||
"swampert",
|
||||
"forretress",
|
||||
"shedinja",
|
||||
"blissey",
|
||||
]
|
||||
.iter()
|
||||
{
|
||||
for name in vec!["baltoy"].iter() {
|
||||
inspector.enemies.push(PokemonInstance {
|
||||
pokemon: pokemon_database.map.get(*name).unwrap().clone(),
|
||||
ivs: {
|
||||
|
|
@ -77,6 +65,29 @@ fn test_init(mut inspector: ResMut<Inspector>, pokemon_database: Res<Database<Po
|
|||
..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(
|
||||
|
|
@ -99,7 +110,7 @@ fn state_changed(
|
|||
let weak = handle.clone_weak();
|
||||
ui_assets
|
||||
.sprite_map
|
||||
.insert(pokemon.key(), (handle, contexts.add_image(weak)));
|
||||
.insert(pokemon.key(), EguiAsset(handle, contexts.add_image(weak)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
100
src/ivpeek/ui.rs
100
src/ivpeek/ui.rs
|
|
@ -5,9 +5,11 @@ use std::collections::HashMap;
|
|||
|
||||
use crate::pokemon::*;
|
||||
|
||||
use super::inspector::Inspector;
|
||||
use super::inspector::{Inspector, PokemonInstance};
|
||||
|
||||
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 IV_WIDTH_MULT: f32 = 4.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)]
|
||||
pub struct UiAssets {
|
||||
pub bar_handle: Handle<Image>,
|
||||
pub sprite_map: HashMap<String, (Handle<Image>, egui::TextureId)>,
|
||||
pub bar_handle: EguiAsset,
|
||||
pub sprite_map: HashMap<String, EguiAsset>,
|
||||
}
|
||||
|
||||
fn load_assets(mut ui_assets: ResMut<UiAssets>, assets: Res<AssetServer>) {
|
||||
ui_assets.bar_handle = assets.load("ui/bar.png");
|
||||
}
|
||||
|
||||
fn ui_system(
|
||||
fn load_assets(
|
||||
mut contexts: EguiContexts,
|
||||
inspector: Res<Inspector>,
|
||||
ui_assets: Res<UiAssets>,
|
||||
mut rendered_texture_id: Local<egui::TextureId>,
|
||||
mut is_initialized: Local<bool>,
|
||||
mut ui_assets: ResMut<UiAssets>,
|
||||
assets: Res<AssetServer>,
|
||||
) {
|
||||
if !*is_initialized {
|
||||
*is_initialized = true;
|
||||
*rendered_texture_id = contexts.add_image(ui_assets.bar_handle.clone_weak());
|
||||
ui_assets.bar_handle = load_egui_asset(&mut contexts, &assets);
|
||||
}
|
||||
|
||||
fn ui_system(mut contexts: EguiContexts, inspector: Res<Inspector>, ui_assets: Res<UiAssets>) {
|
||||
egui::CentralPanel::default().show(contexts.ctx_mut(), |ui| {
|
||||
egui::ScrollArea::vertical().show(ui, |ui| {
|
||||
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.);
|
||||
}
|
||||
|
||||
egui::CentralPanel::default().show(contexts.ctx_mut(), |ui| {
|
||||
let sprite_size = egui::Vec2::new(128., 128.);
|
||||
ui.separator();
|
||||
|
||||
egui::ScrollArea::vertical().show(ui, |ui| {
|
||||
for instance in inspector.enemies.iter().chain(inspector.allies.iter()) {
|
||||
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 nature = instance.nature.clone();
|
||||
|
||||
ui.horizontal(|ui| {
|
||||
ui.horizontal(|ui| {
|
||||
ui.set_min_width(sprite_size.x + 32.);
|
||||
ui.set_max_width(sprite_size.x + 32.);
|
||||
ui.set_min_width(sprite_size.x + SPRITE_PADDING);
|
||||
ui.set_max_width(sprite_size.x + SPRITE_PADDING);
|
||||
// Name
|
||||
ui.label(
|
||||
egui::RichText::new(&pokemon.full_name)
|
||||
.color(egui::Color32::LIGHT_GRAY),
|
||||
);
|
||||
ui.label(egui::RichText::new(&pokemon.full_name).color(egui::Color32::LIGHT_GRAY));
|
||||
|
||||
// Types
|
||||
ui.label(format!(
|
||||
|
|
@ -111,9 +134,6 @@ fn ui_system(
|
|||
3 => {
|
||||
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.set_min_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.add(egui::Image::new(*rendered_texture_id, sprite_size));
|
||||
}
|
||||
});
|
||||
|
||||
ui.add_space(32.);
|
||||
ui.add_space(SPRITE_PADDING);
|
||||
|
||||
ui.vertical(|ui| {
|
||||
for stat in BaseStat::all() {
|
||||
|
|
@ -158,10 +178,8 @@ fn ui_system(
|
|||
let bar_length = base_value as f32 * BASE_STAT_WIDTH_MULT;
|
||||
let color = base_stat_color(base_value);
|
||||
|
||||
let image = egui::Image::new(
|
||||
*rendered_texture_id,
|
||||
[bar_length, BAR_HEIGHT],
|
||||
)
|
||||
let image =
|
||||
egui::Image::new(ui_assets.bar_handle.1, [bar_length, BAR_HEIGHT])
|
||||
.tint(color);
|
||||
ui.add(image);
|
||||
});
|
||||
|
|
@ -183,10 +201,7 @@ fn ui_system(
|
|||
ui.set_width(*width);
|
||||
}
|
||||
if let Some(iv) = instance.ivs.get(&stat) {
|
||||
ui.label(
|
||||
egui::RichText::new(format!("{iv}"))
|
||||
.color(iv_color(*iv)),
|
||||
);
|
||||
ui.label(egui::RichText::new(format!("{iv}")).color(iv_color(*iv)));
|
||||
} else {
|
||||
ui.label("-");
|
||||
}
|
||||
|
|
@ -208,7 +223,7 @@ fn ui_system(
|
|||
// Bar
|
||||
ui.add(
|
||||
egui::Image::new(
|
||||
*rendered_texture_id,
|
||||
ui_assets.bar_handle.1,
|
||||
[bar_length, BAR_HEIGHT],
|
||||
)
|
||||
.tint(color),
|
||||
|
|
@ -216,7 +231,7 @@ fn ui_system(
|
|||
// Track
|
||||
ui.add(
|
||||
egui::Image::new(
|
||||
*rendered_texture_id,
|
||||
ui_assets.bar_handle.1,
|
||||
[track_length, BAR_HEIGHT],
|
||||
)
|
||||
.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 {
|
||||
|
|
|
|||
Loading…
Reference in New Issue