From 43298243fc9dda5fbc0a5c86967099bf21e09bf8 Mon Sep 17 00:00:00 2001 From: Imberflur Date: Fri, 15 Feb 2019 22:01:42 -0500 Subject: [PATCH] setup ui image rendering, started creating test ui with iteraction Former-commit-id: 73235ad6b25ab160e9cde3ad2513d4dd32660161 --- voxygen/Cargo.toml | 3 +- voxygen/src/main.rs | 2 +- voxygen/src/menu/title.rs | 46 ++--- voxygen/src/render/pipelines/ui.rs | 2 +- voxygen/src/session.rs | 18 +- voxygen/src/ui/mod.rs | 124 +++++++++---- voxygen/src/ui/test.rs | 163 ++++++++++++++++++ voxygen/src/ui/title.rs | 67 +++++++ voxygen/src/window.rs | 13 +- voxygen/test_assets/test_bag.png | Bin 0 -> 3639 bytes voxygen/test_assets/test_bag_contents.png | Bin 0 -> 31491 bytes voxygen/test_assets/test_bag_hover.png | Bin 0 -> 3605 bytes voxygen/test_assets/test_bag_press.png | Bin 0 -> 3631 bytes voxygen/test_assets/test_close_btn.png | Bin 0 -> 1130 bytes voxygen/test_assets/test_close_btn_hover.png | Bin 0 -> 1121 bytes voxygen/test_assets/test_close_btn_press.png | Bin 0 -> 1084 bytes voxygen/test_assets/test_menu_bottom.png | Bin 0 -> 1532 bytes .../test_assets/test_menu_button_blank.png | Bin 0 -> 1260 bytes voxygen/test_assets/test_menu_midsection.png | Bin 0 -> 1197 bytes voxygen/test_assets/test_menu_top.png | Bin 0 -> 3822 bytes 20 files changed, 367 insertions(+), 71 deletions(-) create mode 100644 voxygen/src/ui/test.rs create mode 100644 voxygen/src/ui/title.rs create mode 100644 voxygen/test_assets/test_bag.png create mode 100644 voxygen/test_assets/test_bag_contents.png create mode 100644 voxygen/test_assets/test_bag_hover.png create mode 100644 voxygen/test_assets/test_bag_press.png create mode 100644 voxygen/test_assets/test_close_btn.png create mode 100644 voxygen/test_assets/test_close_btn_hover.png create mode 100644 voxygen/test_assets/test_close_btn_press.png create mode 100644 voxygen/test_assets/test_menu_bottom.png create mode 100644 voxygen/test_assets/test_menu_button_blank.png create mode 100644 voxygen/test_assets/test_menu_midsection.png create mode 100644 voxygen/test_assets/test_menu_top.png diff --git a/voxygen/Cargo.toml b/voxygen/Cargo.toml index a9d08f596c..d004032b70 100644 --- a/voxygen/Cargo.toml +++ b/voxygen/Cargo.toml @@ -18,7 +18,8 @@ gfx = "0.17" gfx_device_gl = { version = "0.15", optional = true } gfx_window_glutin = "0.28" glutin = "0.19" -conrod_core = "0.62" +conrod_core = "0.63" +conrod_winit = "0.63" # ECS specs = "0.14" diff --git a/voxygen/src/main.rs b/voxygen/src/main.rs index a3b1518a0d..da36849d3e 100644 --- a/voxygen/src/main.rs +++ b/voxygen/src/main.rs @@ -76,7 +76,7 @@ fn main() { // Set up the initial play state let mut states: Vec> = vec![Box::new(TitleState::new( - &mut global_state.window.renderer_mut(), + &mut global_state.window, ))]; states.last().map(|current_state| { log::info!("Started game with state '{}'", current_state.name()) diff --git a/voxygen/src/menu/title.rs b/voxygen/src/menu/title.rs index 868a86f739..9cdf4b72cf 100644 --- a/voxygen/src/menu/title.rs +++ b/voxygen/src/menu/title.rs @@ -1,47 +1,34 @@ // Library use vek::*; use image; -use conrod_core::widget::image::Image as ImageWidget; -use conrod_core::{Positionable, Sizeable, Widget}; + // Crate use crate::{ PlayState, PlayStateResult, GlobalState, - window::Event, + window::{ + Event, + Window, + }, session::SessionState, - render::{ - Consts, - UiLocals, - Renderer, - }, - ui::{ - Ui - }, + ui::title::TitleUi, }; + pub struct TitleState { - ui: Ui + title_ui: TitleUi, } impl TitleState { /// Create a new `TitleState` - pub fn new(renderer: &mut Renderer) -> Self { - let mut ui = Ui::new(renderer, [500.0, 500.0]).unwrap(); - let widget_id = ui.new_widget(); - let image = image::open(concat!(env!("CARGO_MANIFEST_DIR"), "/test_assets/test.png")).unwrap(); - let title_img = ui.new_image(renderer, &image).unwrap(); - ui.set_widgets(|ui_cell| { - ImageWidget::new(title_img) - .x_y(0.0, 0.0) - .w_h(500.0,500.0) - .set(widget_id, ui_cell); - }); + pub fn new(window: &mut Window) -> Self { Self { - ui + title_ui: TitleUi::new(window) } } + } // The background colour @@ -56,21 +43,24 @@ impl PlayState for TitleState { Event::Close => return PlayStateResult::Shutdown, // When space is pressed, start a session Event::Char(' ') => return PlayStateResult::Push( - Box::new(SessionState::new(global_state.window.renderer_mut()).unwrap()), // TODO: Handle this error + Box::new(SessionState::new(&mut global_state.window).unwrap()), // TODO: Handle this error ), + // Pass events to ui + Event::UiEvent(input) => { + self.title_ui.handle_event(input); + } // Ignore all other events _ => {}, } } - global_state.window.renderer_mut().clear(BG_COLOR); // Maintain the UI - //self.ui.maintain(global_state.window.renderer_mut()); + self.title_ui.maintain(global_state.window.renderer_mut()); // Draw the UI to the screen - self.ui.render(global_state.window.renderer_mut()); + self.title_ui.render(global_state.window.renderer_mut()); // Finish the frame global_state.window.renderer_mut().flush(); diff --git a/voxygen/src/render/pipelines/ui.rs b/voxygen/src/render/pipelines/ui.rs index e152da68e6..449b07fe54 100644 --- a/voxygen/src/render/pipelines/ui.rs +++ b/voxygen/src/render/pipelines/ui.rs @@ -35,7 +35,7 @@ gfx_defines! { locals: gfx::ConstantBuffer = "u_locals", tex: gfx::TextureSampler<[f32; 4]> = "u_tex", - tgt_color: gfx::RenderTarget = "tgt_color", + tgt_color: gfx::BlendTarget = ("tgt_color", gfx::state::ColorMask::all(), gfx::preset::blend::ALPHA), tgt_depth: gfx::DepthTarget = gfx::preset::depth::PASS_TEST, } } diff --git a/voxygen/src/session.rs b/voxygen/src/session.rs index c694f2c6b3..0ebb183d1f 100644 --- a/voxygen/src/session.rs +++ b/voxygen/src/session.rs @@ -18,9 +18,10 @@ use crate::{ PlayStateResult, GlobalState, key_state::KeyState, - window::{Event, Key}, + window::{Event, Key, Window}, render::Renderer, scene::Scene, + ui::test::TestUi, }; const FPS: u64 = 60; @@ -29,18 +30,21 @@ pub struct SessionState { scene: Scene, client: Client, key_state: KeyState, + // TODO: remove this + test_ui: TestUi, } /// Represents an active game session (i.e: one that is being played) impl SessionState { /// Create a new `SessionState` - pub fn new(renderer: &mut Renderer) -> Result { + pub fn new(window: &mut Window) -> Result { let client = Client::new(([127, 0, 0, 1], 59003))?.with_test_state(); // <--- TODO: Remove this Ok(Self { // Create a scene for this session. The scene handles visible elements of the game world - scene: Scene::new(renderer, &client), + scene: Scene::new(window.renderer_mut(), &client), client, key_state: KeyState::new(), + test_ui: TestUi::new(window), }) } } @@ -78,6 +82,8 @@ impl SessionState { // Render the screen using the global renderer self.scene.render_to(renderer); + // Draw the UI to the screen + self.test_ui.render(renderer); // Finish the frame renderer.flush(); @@ -123,6 +129,10 @@ impl PlayState for SessionState { Event::KeyUp(Key::MoveBack) => self.key_state.down = false, Event::KeyUp(Key::MoveLeft) => self.key_state.left = false, Event::KeyUp(Key::MoveRight) => self.key_state.right = false, + // Pass events to ui + Event::UiEvent(input) => { + self.test_ui.handle_event(input); + } // Pass all other events to the scene event => { self.scene.handle_input_event(event); }, }; @@ -135,6 +145,8 @@ impl PlayState for SessionState { // Maintain the scene self.scene.maintain(global_state.window.renderer_mut(), &self.client); + // Maintain the UI + self.test_ui.maintain(global_state.window.renderer_mut()); // Render the session self.render(global_state.window.renderer_mut()); diff --git a/voxygen/src/ui/mod.rs b/voxygen/src/ui/mod.rs index e08423a7af..ce09e6f5f7 100644 --- a/voxygen/src/ui/mod.rs +++ b/voxygen/src/ui/mod.rs @@ -1,7 +1,7 @@ -// TODO: what was the purpose of size request? -// TODO: cache entire UI render -// TODO: do we need to store locals for each widget? -// TODO: sizing? : renderer.get_resolution().map(|e| e as f32) +pub mod title; +pub mod test; +// TODO: cache entire UI render (would be somewhat pointless if we are planning on constantly animated ui) +// TODO: figure out proper way to propagate events down to the ui // Library use image::DynamicImage; @@ -10,7 +10,10 @@ use conrod_core::{ UiBuilder, UiCell, image::{Map, Id as ImgId}, - widget::Id as WidgId, + widget::{Id as WidgId, id::Generator}, + render::Primitive, + event::Input, + input::{Global, Widget}, }; // Crate @@ -26,6 +29,7 @@ use crate::{ Consts, create_ui_quad_mesh, }, + window::Window, }; #[derive(Debug)] @@ -38,6 +42,7 @@ pub struct Cache { blank_texture: Texture, } +// TODO: Should functions be returning UiError instead of Error? impl Cache { pub fn new(renderer: &mut Renderer) -> Result { Ok(Self { @@ -50,21 +55,27 @@ impl Cache { pub fn blank_texture(&self) -> &Texture { &self.blank_texture } } +pub enum UiPrimitive { + Image(Consts, ImgId) +} + pub struct Ui { ui: CrUi, image_map: Map>, cache: Cache, - locals: Consts, + // Primatives to draw on the next render + ui_primitives: Vec, } impl Ui { - pub fn new(renderer: &mut Renderer, dim: [f64; 2]) -> Result { + pub fn new(window: &mut Window) -> Result { + // Retrieve the logical size of the window content + let (w, h) = window.logical_size(); Ok(Self { - ui: UiBuilder::new(dim).build(), + ui: UiBuilder::new([w, h]).build(), image_map: Map::new(), - cache: Cache::new(renderer)?, - locals: renderer.create_consts(&[UiLocals::default()])?, - + cache: Cache::new(window.renderer_mut())?, + ui_primitives: vec![], }) } @@ -72,42 +83,83 @@ impl Ui { Ok(self.image_map.insert(renderer.create_texture(image)?)) } - pub fn new_widget(&mut self) -> WidgId { - self.ui.widget_id_generator().next() + pub fn id_generator(&mut self) -> Generator { + self.ui.widget_id_generator() } - pub fn set_widgets(&mut self, f: F) where F: FnOnce(&mut UiCell) { - f(&mut self.ui.set_widgets()); + pub fn set_widgets(&mut self) -> UiCell { + self.ui.set_widgets() + } + + pub fn handle_event(&mut self, event: Input) { + self.ui.handle_event(event); + } + + pub fn widget_input(&self, id: WidgId) -> Widget { + self.ui.widget_input(id) + } + + pub fn global_input(&self) -> &Global { + self.ui.global_input() } - // TODO: change render back to &self and use maintain for mutable operations pub fn maintain(&mut self, renderer: &mut Renderer) { - - //renderer.get_resolution().map(|e| e as f32), - } - - pub fn render(&mut self, renderer: &mut Renderer) { - - if let Some(mut primitives) = Some(self.ui.draw()) { - //render the primatives one at a time + let ref mut ui = self.ui; + // removed this because ui will resize itself now that it recieves events + // update window size + //let res = renderer.get_resolution().map(|e| e as f64); + //if res[0] != ui.win_w || res[1] != ui.win_h { + // ui.win_w = res[0]; + // ui.win_h = res[1]; + // ui.needs_redraw(); + //} + // Gather primatives and recreate locals only if ui_changed + if let Some(mut primitives) = ui.draw_if_changed() { + self.ui_primitives.clear(); while let Some(prim) = primitives.next() { - use conrod_core::render::{Primitive, PrimitiveKind}; - let Primitive {kind, scizzor, rect, ..} = prim; + // Transform from conrod to our render coords + // Conrod uses the center of the screen as the origin + // Up & Right are positive directions + let x = prim.rect.left(); + let y = prim.rect.top(); + let (w, h) = prim.rect.w_h(); + let bounds = [ + (x / ui.win_w + 0.5) as f32, + (-1.0 * (y / ui.win_h) + 0.5) as f32, + (w / ui.win_w) as f32, + (h / ui.win_h) as f32 + ]; + // TODO: Remove this + let new_ui_locals = renderer.create_consts(&[UiLocals::new(bounds)]) + .expect("Could not create new const for ui locals"); + use conrod_core::render::{PrimitiveKind}; + // TODO: Use scizzor + let Primitive {kind, scizzor, id, ..} = prim; match kind { PrimitiveKind::Image { image_id, color, source_rect } => { - renderer.update_consts(&mut self.locals, &[UiLocals::new( - [0.0, 0.0, 1.0, 1.0], - )]); - let tex = self.image_map.get(&image_id).expect("Image does not exist in image map"); - renderer.render_ui_element(&self.cache.model(), &self.locals, &tex); + //renderer.update_consts(&mut self.locals, &[UiLocals::new( + // [0.0, 0.0, 1.0, 1.0], + // )]); + self.ui_primitives.push(UiPrimitive::Image(new_ui_locals, image_id)); } - PrimitiveKind::Other {..} => {println!("primitive kind other with id");} - PrimitiveKind::Rectangle {..} => {println!("primitive kind rect");} - PrimitiveKind::Text {..} => {println!("primitive kind text");} - PrimitiveKind::TrianglesMultiColor {..} => {println!("primitive kind multicolor");} - PrimitiveKind::TrianglesSingleColor {..} => {println!("primitive kind singlecolor");} + _ => {} + // TODO: Add these + //PrimitiveKind::Other {..} => {println!("primitive kind other with id {:?}", id);} + //PrimitiveKind::Rectangle { color } => {println!("primitive kind rect[x:{},y:{},w:{},h:{}] with color {:?} and id {:?}", x, y, w, h, color, id);} + //PrimitiveKind::Text {..} => {println!("primitive kind text with id {:?}", id);} + //PrimitiveKind::TrianglesMultiColor {..} => {println!("primitive kind multicolor with id {:?}", id);} + //PrimitiveKind::TrianglesSingleColor {..} => {println!("primitive kind singlecolor with id {:?}", id);} } } } } + + pub fn render(&self, renderer: &mut Renderer) { + self.ui_primitives.iter().for_each(|ui_primitive| match ui_primitive { + UiPrimitive::Image(ui_locals, image_id) => { + let tex = self.image_map.get(&image_id).expect("Image does not exist in image map"); + renderer.render_ui_element(&self.cache.model(), &ui_locals, &tex); + } + }); + } } diff --git a/voxygen/src/ui/test.rs b/voxygen/src/ui/test.rs new file mode 100644 index 0000000000..947f01e599 --- /dev/null +++ b/voxygen/src/ui/test.rs @@ -0,0 +1,163 @@ +// Library +use conrod_core::{ + Positionable, + Sizeable, + Widget, + widget_ids, + event::{Widget as WidgetEvent, Input, Click}, + image::Id as ImgId, + input::state::mouse::Button as MouseButton, + widget::{ + Image, + Button, + Id as WidgId, + } +}; + +// Crate +use crate::{ + window::Window, + render::Renderer, +}; + +// Local +use super::Ui; + +widget_ids!{ + struct Ids { + menu_buttons[], + bag, + bag_contents, + bag_close, + menu_top, + menu_mid, + menu_bot, + } +} + +// TODO: make macro to mimic widget_ids! for images ids or find another solution to simplify addition of new images to the code. +struct Imgs { + menu_button: ImgId, + bag: ImgId, + bag_hover: ImgId, + bag_press: ImgId, + bag_contents: ImgId, + menu_top: ImgId, + menu_mid: ImgId, + menu_bot: ImgId, + close_button: ImgId, + close_button_hover: ImgId, + close_button_press: ImgId, +} +impl Imgs { + fn new(ui: &mut Ui, renderer: &mut Renderer) -> Imgs { + let mut load = |filename| { + let image = image::open(&[env!("CARGO_MANIFEST_DIR"), "/test_assets/", filename].concat()).unwrap(); + ui.new_image(renderer, &image).unwrap() + }; + Imgs { + menu_button: load("test_menu_button_blank.png"), + bag: load("test_bag.png"), + bag_hover: load("test_bag_hover.png"), + bag_press: load("test_bag_press.png"), + bag_contents: load("test_bag_contents.png"), + menu_top: load("test_menu_top.png"), + menu_mid: load("test_menu_midsection.png"), + menu_bot: load("test_menu_bottom.png"), + close_button: load("test_close_btn.png"), + close_button_hover: load("test_close_btn_hover.png"), + close_button_press: load("test_close_btn_press.png"), + } + } +} + +pub struct TestUi { + ui: Ui, + ids: Ids, + imgs: Imgs, + bag_open: bool, +} + +impl TestUi { + pub fn new(window: &mut Window) -> Self { + let mut ui = Ui::new(window).unwrap(); + // Generate ids + let mut ids = Ids::new(ui.id_generator()); + ids.menu_buttons.resize(5, &mut ui.id_generator()); + // Load images + let imgs = Imgs::new(&mut ui, window.renderer_mut()); + Self { + ui, + imgs, + ids, + bag_open: false, + } + } + + fn ui_layout(&mut self) { + // Update if a event has occured + if !self.ui.global_input().events().next().is_some() { + return; + } + // Process input + for e in self.ui.widget_input(self.ids.bag).events() { + match e { + WidgetEvent::Click(click) => match click.button { + MouseButton::Left => { + self.bag_open = true; + } + _ => {} + } + _ => {} + } + } + for e in self.ui.widget_input(self.ids.bag_close).events() { + match e { + WidgetEvent::Click(click) => match click.button { + MouseButton::Left => { + self.bag_open = false; + } + _ => {} + } + _ => {} + } + } + let bag_open = self.bag_open; + let mut ui_cell = self.ui.set_widgets(); + // Bag + Button::image(self.imgs.bag) + .bottom_right_with_margin(20.0) + .hover_image(if bag_open { self.imgs.bag } else { self.imgs.bag_hover }) + .press_image(if bag_open { self.imgs.bag } else { self.imgs.bag_press }) + .w_h(51.0, 58.0) + .set(self.ids.bag, &mut ui_cell); + // Bag contents + if self.bag_open { + // Contents + Image::new(self.imgs.bag_contents) + .w_h(212.0, 246.0) + .x_y_relative_to(self.ids.bag, -92.0-25.5+12.0, 109.0+29.0-13.0) + .set(self.ids.bag_contents, &mut ui_cell); + // Close button + Button::image(self.imgs.close_button) + .w_h(20.0, 20.0) + .hover_image(self.imgs.close_button_hover) + .press_image(self.imgs.close_button_press) + .top_right_with_margins_on(self.ids.bag_contents, 0.0, 10.0) + .set(self.ids.bag_close, &mut ui_cell); + } + } + + pub fn handle_event(&mut self, input: Input) { + self.ui.handle_event(input); + } + + pub fn maintain(&mut self, renderer: &mut Renderer) { + self.ui_layout(); + self.ui.maintain(renderer); + } + + pub fn render(&self, renderer: &mut Renderer) { + self.ui.render(renderer); + } +} diff --git a/voxygen/src/ui/title.rs b/voxygen/src/ui/title.rs new file mode 100644 index 0000000000..c16718b524 --- /dev/null +++ b/voxygen/src/ui/title.rs @@ -0,0 +1,67 @@ +// Library +use conrod_core::{ + Positionable, + Sizeable, + Widget, + event::Input, + image::Id as ImgId, + widget::{ + Image as ImageWidget, + Canvas as CanvasWidget, + Id as WidgId, + } +}; + +// Crate +use crate::{ + window::Window, + render::Renderer, +}; + +// Local +use super::Ui; + +pub struct TitleUi { + ui: Ui, + widget_id: WidgId, + title_img_id: ImgId, +} + +impl TitleUi { + pub fn new(window: &mut Window) -> Self { + let mut ui = Ui::new(window).unwrap(); + let widget_id = ui.id_generator().next(); + let image = image::open(concat!(env!("CARGO_MANIFEST_DIR"), "/test_assets/test.png")).unwrap(); + let title_img_id = ui.new_image(window.renderer_mut(), &image).unwrap(); + Self { + ui, + widget_id, + title_img_id, + } + } + + fn ui_layout(&mut self) { + // Update if a event has occured + if !self.ui.global_input().events().next().is_some() { + return; + } + let mut ui_cell = self.ui.set_widgets(); + ImageWidget::new(self.title_img_id) + .top_left() + .w_h(500.0, 500.0) + .set(self.widget_id, &mut ui_cell); + } + + pub fn handle_event(&mut self, input: Input) { + self.ui.handle_event(input); + } + + pub fn maintain(&mut self, renderer: &mut Renderer) { + self.ui_layout(); + self.ui.maintain(renderer); + } + + pub fn render(&self, renderer: &mut Renderer) { + self.ui.render(renderer); + } +} diff --git a/voxygen/src/window.rs b/voxygen/src/window.rs index 37c38bc232..251660f146 100644 --- a/voxygen/src/window.rs +++ b/voxygen/src/window.rs @@ -82,7 +82,13 @@ impl Window { let key_map = &self.key_map; let mut events = vec![]; - self.events_loop.poll_events(|event| match event { + self.events_loop.poll_events(|event| match { + // Hack grab of events for testing ui + if let Some(event) = conrod_winit::convert_event(event.clone(), window.window()) { + events.push(Event::UiEvent(event)); + } + event + } { glutin::Event::WindowEvent { event, .. } => match event { glutin::WindowEvent::CloseRequested => events.push(Event::Close), glutin::WindowEvent::Resized(glutin::dpi::LogicalSize { width, height }) => { @@ -136,6 +142,10 @@ impl Window { self.window.grab_cursor(grab) .expect("Failed to grab/ungrab cursor"); } + + pub fn logical_size(&self) -> (f64, f64) { + self.window.get_inner_size().unwrap_or(glutin::dpi::LogicalSize::new(0.0, 0.0)).into() + } } /// Represents a key that the game recognises after keyboard mapping @@ -164,4 +174,5 @@ pub enum Event { KeyDown(Key), /// A key that the game recognises has been released down KeyUp(Key), + UiEvent(conrod_core::event::Input) } diff --git a/voxygen/test_assets/test_bag.png b/voxygen/test_assets/test_bag.png new file mode 100644 index 0000000000000000000000000000000000000000..fa923309b5627ad895f34dc74640d2cce9702451 GIT binary patch literal 3639 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 JPDHLkV1f{Jzk>h( literal 0 HcmV?d00001 diff --git a/voxygen/test_assets/test_bag_contents.png b/voxygen/test_assets/test_bag_contents.png new file mode 100644 index 0000000000000000000000000000000000000000..faf84802112243ee38dab9fbb3da5671d71f9890 GIT binary patch literal 31491 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�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 b?0ftd#yGQ7w2gz500000NkvXXu0mjf`h2CG literal 0 HcmV?d00001 diff --git a/voxygen/test_assets/test_bag_press.png b/voxygen/test_assets/test_bag_press.png new file mode 100644 index 0000000000000000000000000000000000000000..4c8be5229265d84fb3ffa9662de03a52958dc01b GIT binary patch literal 3631 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 B!Q21< literal 0 HcmV?d00001 diff --git a/voxygen/test_assets/test_close_btn.png b/voxygen/test_assets/test_close_btn.png new file mode 100644 index 0000000000000000000000000000000000000000..66e2ad8c025ccfbb5c0c28e41cb7217aa6a3d2a7 GIT binary patch literal 1130 zcmV-w1eN=VP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y9E-_;&oJ#-z1KUYNK~y+Tg_KKA8&?#^$2i5ouknn>uX%Vp zW6#**2ez?+03mAAR!K=oh)@>vx#poXAtDl96wzH)sH)WOfDk)KSyV-2$p*1w!B=2` zgb=L$J@*1lQBfJ`ueo#YncqF<-gAyHJ39-enVA_(Pfz2`PcQNA=MLU2-L79cZ}H~U zORTM}fgXWLNG6kDGSoCIErYUUV7TI7xawfE=HS5%x=(8(q<$~Y?cdJ7`UuoC4Vg>^ z)qD>32-GfGDC#K`H3iMAf|hw*eKgl=C~#E;^}K<>asfZSc#hwH`xP4-8xZWAiL9=n zS+p_QTS8wUi%hf!$)Er?=0j2Hx+Yih!4`c;^av>F2@F*VB8x9 zC8wdJ#^FfaC=g7G1fUZ9-_oLYVMZ_3-DCtFMbm2=6uylYV_!lTt`+fFvx1tXLzO~M zBVF)hA4=qn7!D#54j~#2bFnd-GYIODrwp12cfn4@xR>8gd<9{I!hG0QLCe6R~j{^tD zpppzCC;E}k>X@H@jpO5Ec6*qcn?tA5!P(gv|2{uIN6jnp@ST_+4PC_ON8p8rg9RP6 zR1j9|4zzTdd$qs6kCT%Vtgo+QYio;-4-XHqySs~gKF`n8mHcSl29!k+wryi^aS?la zdpJEk<(?fJ9AJ5QnHNEtHoXxzd=oGx!Y~Xp8V#(ju5!@P(Gj+{x6$9`j$&6 zdpBRo6|hcuXh=b5VamZ|57n!Mub+%zVqyZW>%#LqjE|4w`Ln0^=GhaJ(_vU*7q@p( zBCmZ89H4}JQ1^JY=aLdksfS9;Pi5ByIdm6tBt!~BqNJ8WL7MBK#O@{=0?7fGatN-L zz&)zzZ=XJfP|E34hgm9g6U~B&ijjgTb|V|{AxnwN#%3&lESnSAH!13;bpge+gkFpK zfMcRg|33QkJ_J>XLy;uZ2*^BT-A0q6$cO<{5&_hb*Ht08N`M+j0A(|Sk($fPu3)G< zD+DtYhn9%LBTrk@ahk5h>$*lew{49oNJBq~y|2c7G|$!>SE43Z&hX~Web wSe{;}#5HpHW^1g6T84&HDuqNMK?&c+-?=cVIE>}ar2qf`07*qoM6N<$g0wyV&Hw-a literal 0 HcmV?d00001 diff --git a/voxygen/test_assets/test_close_btn_hover.png b/voxygen/test_assets/test_close_btn_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..6a50055ebb249f3e82267fbe4f193138820b6efc GIT binary patch literal 1121 zcmV-n1fKheP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y9E-_;&oJ#-z1JX%EK~y+Tg_O&08&wp>$95YxevM~5k9fx8 zvB#eAW5%!8abi1ZlO|ChZKJU03IXdRQmLraMI|UAv{fpxsE}Cjl7MB95F!$P3JbO% z5S3bl*znTFxi>K-!XlPF`99A4?m73KbA-LUJuvO=?qX+W2e)3mfrB^h;Nb4rdh5<@ z+`4%KhlhutpTHz&ng%Azm_gCZqF%Hx^j!=C7fTHn7bj?u_C}<+T8Z1=e(mNnplO=O zX0r%N1uPJ#S1F>B(@`-Mbn*(i_G!)1TGLYC846k@3-k3dUb+4P-h1~Ej*gBXI0YN| zoQY1w!BVq|*>WD))HJl1052UvMGBviCxzgMA*j;=syP({zf5wEBb)C-=+#{e0uLRx z0KZ_OYGmL_Qz#S6Oh#c4{NFND7htE3_dP9%8b#A|EDGPj_04q%!$t)w9UqNi4u%wm zkqo0IhfpPN#6%3qL>#F^f{TsWnnlnWdCH*KL>P{q=3c(E{XB#bg?V|_N7u>0Rbq5{ z827{&K5I4b<6wZti;MWU*~BNE4t`iz;Pc0$As%K#vOSLi+53jbAL-@oO$MxSV84`u zuf0DSwLA7`3GOEuHxzP z@;{#aLi2B`RUD2+c%2TN2pmoVQpj(n(|BkY_-<~FgMQoG#7_iz$FjI&S>{0ZKR|lr zF)(02=^XZD313pU<2(F%V*}p?0UwX=@PV#R1`bYu{S%-=z_%so>_^eH$&WGywkQuR zDF!nU!u`Z~Jera5e!Yed$+LT^iu+XWANW2#3VeJT)bSuWg`ybd_O34S+ULMNCFI3c zjc0p7lVD5JRALb-yD;SV1<1)bDFKO+T8hVLZJH8$ifjlZM`6oxc&3U4s_7TEo`X;= z6zf zyVP+yUXj;zgHG-_CRLD$ITHIHk7sF}?YGIRUe!U18cV^PLATqbkPQ{CNhv_k40&42 zWvN-zak(2{?SHgNV*QiZD~dwO90O}~4<5a!tx+ivv_uB;WXM|DFsOj#>9ML@qmzHO n$9ibdGNDsWs+0-6UJri*HJybhd4=*Z00000NkvXXu0mjfOCtZA literal 0 HcmV?d00001 diff --git a/voxygen/test_assets/test_close_btn_press.png b/voxygen/test_assets/test_close_btn_press.png new file mode 100644 index 0000000000000000000000000000000000000000..280cb989130af5dd06c28e6668d1b06e96cf3a85 GIT binary patch literal 1084 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 LNkvXXu0mjf5mh7m literal 0 HcmV?d00001 diff --git a/voxygen/test_assets/test_menu_top.png b/voxygen/test_assets/test_menu_top.png new file mode 100644 index 0000000000000000000000000000000000000000..7851741b1592798ec35ef47ff1b4702d7b300885 GIT binary patch literal 3822 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