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::*,
};
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)));
}
}
}

View File

@ -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 {