Implement a background for the option menus

This commit is contained in:
Thinkofname 2016-04-21 11:00:05 +01:00
parent ebc11224e7
commit 380a844272
3 changed files with 96 additions and 23 deletions

View File

@ -79,8 +79,8 @@ pub struct Renderer {
trans: Option<TransInfo>, trans: Option<TransInfo>,
last_width: u32, pub width: u32,
last_height: u32, pub height: u32,
// Light renderering // Light renderering
pub light_level: f32, pub light_level: f32,
@ -217,8 +217,8 @@ impl Renderer {
element_buffer_size: 0, element_buffer_size: 0,
element_buffer_type: gl::UNSIGNED_BYTE, element_buffer_type: gl::UNSIGNED_BYTE,
last_width: 0, width: 0,
last_height: 0, height: 0,
camera: Camera { camera: Camera {
pos: cgmath::Point3::new(0.0, 0.0, 0.0), pos: cgmath::Point3::new(0.0, 0.0, 0.0),
@ -255,9 +255,9 @@ impl Renderer {
} }
} }
if self.last_height != height || self.last_width != width { if self.height != height || self.width != width {
self.last_width = width; self.width = width;
self.last_height = height; self.height = height;
gl::viewport(0, 0, width as i32, height as i32); gl::viewport(0, 0, width as i32, height as i32);
self.perspective_matrix = cgmath::Matrix4::from( self.perspective_matrix = cgmath::Matrix4::from(

View File

@ -41,14 +41,14 @@ macro_rules! get_matched_str {
) )
} }
pub struct UIElement { pub struct UIElements {
elements: ui::Collection elements: ui::Collection,
// TODO: Add background of some sort background: ui::ElementRef<ui::Image>,
} }
pub struct SettingsMenu { pub struct SettingsMenu {
console: Arc<Mutex<console::Console>>, console: Arc<Mutex<console::Console>>,
elements: Option<UIElement>, elements: Option<UIElements>,
show_disconnect_button: bool show_disconnect_button: bool
} }
@ -66,6 +66,15 @@ impl super::Screen for SettingsMenu {
fn on_active(&mut self, renderer: &mut render::Renderer, ui_container: &mut ui::Container) { fn on_active(&mut self, renderer: &mut render::Renderer, ui_container: &mut ui::Container) {
let mut elements = ui::Collection::new(); let mut elements = ui::Collection::new();
let mut background = ui::Image::new(
render::Renderer::get_texture(renderer.get_textures_ref(), "steven:solid"),
0.0, 0.0, 854.0, 480.0,
0.0, 0.0, 1.0, 1.0,
0, 0, 0
);
background.set_a(100);
let background = elements.add(ui_container.add(background));
// From top and down // From top and down
let (btn_audio_settings, txt_audio_settings) = new_submenu_button("Audio settings...", renderer, ui_container, -160.0, -50.0); let (btn_audio_settings, txt_audio_settings) = new_submenu_button("Audio settings...", renderer, ui_container, -160.0, -50.0);
super::button_action(ui_container, btn_audio_settings.clone(), Some(txt_audio_settings.clone()), move |game, _| { super::button_action(ui_container, btn_audio_settings.clone(), Some(txt_audio_settings.clone()), move |game, _| {
@ -114,8 +123,9 @@ impl super::Screen for SettingsMenu {
elements.add(txt_exit_game); elements.add(txt_exit_game);
} }
self.elements = Some(UIElement { self.elements = Some(UIElements {
elements: elements elements: elements,
background: background,
}); });
} }
@ -128,7 +138,20 @@ impl super::Screen for SettingsMenu {
} }
// Called every frame the screen is active // Called every frame the screen is active
fn tick(&mut self, _delta: f64, _renderer: &mut render::Renderer, _ui_container: &mut ui::Container) -> Option<Box<super::Screen>> { fn tick(&mut self, _delta: f64, renderer: &mut render::Renderer, ui_container: &mut ui::Container) -> Option<Box<super::Screen>> {
let elements = self.elements.as_mut().unwrap();
{
let mode = ui_container.mode;
let background = ui_container.get_mut(&elements.background);
background.set_width(match mode {
ui::Mode::Unscaled(scale) => 854.0 / scale,
ui::Mode::Scaled => renderer.width as f64,
});
background.set_height(match mode {
ui::Mode::Unscaled(scale) => 480.0 / scale,
ui::Mode::Scaled => renderer.height as f64,
});
}
None None
} }
@ -144,7 +167,7 @@ impl super::Screen for SettingsMenu {
pub struct VideoSettingsMenu { pub struct VideoSettingsMenu {
console: Arc<Mutex<console::Console>>, console: Arc<Mutex<console::Console>>,
elements: Option<UIElement>, elements: Option<UIElements>,
} }
impl VideoSettingsMenu { impl VideoSettingsMenu {
@ -160,6 +183,15 @@ impl super::Screen for VideoSettingsMenu {
fn on_active(&mut self, renderer: &mut render::Renderer, ui_container: &mut ui::Container) { fn on_active(&mut self, renderer: &mut render::Renderer, ui_container: &mut ui::Container) {
let mut elements = ui::Collection::new(); let mut elements = ui::Collection::new();
let mut background = ui::Image::new(
render::Renderer::get_texture(renderer.get_textures_ref(), "steven:solid"),
0.0, 0.0, 854.0, 480.0,
0.0, 0.0, 1.0, 1.0,
0, 0, 0
);
background.set_a(100);
let background = elements.add(ui_container.add(background));
// Load defaults // Load defaults
let (r_max_fps, r_fov, r_vsync) = { let (r_max_fps, r_fov, r_vsync) = {
let console = self.console.lock().unwrap(); let console = self.console.lock().unwrap();
@ -198,8 +230,9 @@ impl super::Screen for VideoSettingsMenu {
}); });
elements.add(btn_done); elements.add(btn_done);
elements.add(txt_done); elements.add(txt_done);
self.elements = Some(UIElement { self.elements = Some(UIElements {
elements: elements elements: elements,
background: background,
}); });
} }
@ -212,7 +245,20 @@ impl super::Screen for VideoSettingsMenu {
} }
// Called every frame the screen is active // Called every frame the screen is active
fn tick(&mut self, _delta: f64, _renderer: &mut render::Renderer, _ui_container: &mut ui::Container) -> Option<Box<super::Screen>> { fn tick(&mut self, _delta: f64, renderer: &mut render::Renderer, ui_container: &mut ui::Container) -> Option<Box<super::Screen>> {
let elements = self.elements.as_mut().unwrap();
{
let mode = ui_container.mode;
let background = ui_container.get_mut(&elements.background);
background.set_width(match mode {
ui::Mode::Unscaled(scale) => 854.0 / scale,
ui::Mode::Scaled => renderer.width as f64,
});
background.set_height(match mode {
ui::Mode::Unscaled(scale) => 480.0 / scale,
ui::Mode::Scaled => renderer.height as f64,
});
}
None None
} }
@ -228,7 +274,7 @@ impl super::Screen for VideoSettingsMenu {
pub struct AudioSettingsMenu { pub struct AudioSettingsMenu {
console: Arc<Mutex<console::Console>>, console: Arc<Mutex<console::Console>>,
elements: Option<UIElement> elements: Option<UIElements>
} }
impl AudioSettingsMenu { impl AudioSettingsMenu {
@ -244,6 +290,15 @@ impl super::Screen for AudioSettingsMenu {
fn on_active(&mut self, renderer: &mut render::Renderer, ui_container: &mut ui::Container) { fn on_active(&mut self, renderer: &mut render::Renderer, ui_container: &mut ui::Container) {
let mut elements = ui::Collection::new(); let mut elements = ui::Collection::new();
let mut background = ui::Image::new(
render::Renderer::get_texture(renderer.get_textures_ref(), "steven:solid"),
0.0, 0.0, 854.0, 480.0,
0.0, 0.0, 1.0, 1.0,
0, 0, 0
);
background.set_a(100);
let background = elements.add(ui_container.add(background));
let master_volume = { let master_volume = {
let console = self.console.lock().unwrap(); let console = self.console.lock().unwrap();
(console.get(settings::CL_MASTER_VOLUME).clone()) (console.get(settings::CL_MASTER_VOLUME).clone())
@ -260,8 +315,9 @@ impl super::Screen for AudioSettingsMenu {
elements.add(btn_done); elements.add(btn_done);
elements.add(txt_done); elements.add(txt_done);
self.elements = Some(UIElement { self.elements = Some(UIElements {
elements: elements elements: elements,
background: background,
}); });
} }
@ -274,7 +330,20 @@ impl super::Screen for AudioSettingsMenu {
} }
// Called every frame the screen is active // Called every frame the screen is active
fn tick(&mut self, _delta: f64, _renderer: &mut render::Renderer, _ui_container: &mut ui::Container) -> Option<Box<super::Screen>> { fn tick(&mut self, _delta: f64, renderer: &mut render::Renderer, ui_container: &mut ui::Container) -> Option<Box<super::Screen>> {
let elements = self.elements.as_mut().unwrap();
{
let mode = ui_container.mode;
let background = ui_container.get_mut(&elements.background);
background.set_width(match mode {
ui::Mode::Unscaled(scale) => 854.0 / scale,
ui::Mode::Scaled => renderer.width as f64,
});
background.set_height(match mode {
ui::Mode::Unscaled(scale) => 480.0 / scale,
ui::Mode::Scaled => renderer.height as f64,
});
}
None None
} }

View File

@ -193,6 +193,7 @@ element_impl!(
Button Button
); );
#[derive(Clone, Copy, PartialEq)]
pub enum Mode { pub enum Mode {
Scaled, Scaled,
Unscaled(f64), Unscaled(f64),
@ -290,6 +291,7 @@ const SCREEN: Region = Region {
pub struct Container { pub struct Container {
pub mode: Mode, pub mode: Mode,
last_mode: Mode,
elements: HashMap<ElementRefInner, Element>, elements: HashMap<ElementRefInner, Element>,
// We need the order // We need the order
elements_list: Vec<ElementRefInner>, elements_list: Vec<ElementRefInner>,
@ -305,6 +307,7 @@ impl Container {
pub fn new() -> Container { pub fn new() -> Container {
Container { Container {
mode: Mode::Scaled, mode: Mode::Scaled,
last_mode: Mode::Scaled,
elements: HashMap::new(), elements: HashMap::new(),
elements_list: Vec::new(), elements_list: Vec::new(),
version: 0xFFFF, version: 0xFFFF,
@ -356,11 +359,12 @@ impl Container {
}; };
if self.last_sw != sw || self.last_sh != sh || self.last_width != width || if self.last_sw != sw || self.last_sh != sh || self.last_width != width ||
self.last_height != height || self.version != renderer.ui.version { self.last_height != height || self.version != renderer.ui.version || self.last_mode != self.mode {
self.last_sw = sw; self.last_sw = sw;
self.last_sh = sh; self.last_sh = sh;
self.last_width = width; self.last_width = width;
self.last_height = height; self.last_height = height;
self.last_mode = self.mode;
for (_, e) in &mut self.elements { for (_, e) in &mut self.elements {
e.set_dirty(true); e.set_dirty(true);
if self.version != renderer.ui.version { if self.version != renderer.ui.version {