This commit is contained in:
Thinkofdeath 2015-09-25 15:20:55 +01:00
parent 0d3ff98ad5
commit fcacd91e3a
9 changed files with 50 additions and 33 deletions

View File

@ -38,7 +38,7 @@ impl Profile {
if negative {
twos_compliment(&mut hash);
}
let hash_str = hash.iter().map(|b| format!("{:02X}", b)).collect::<Vec<String>>().connect("");
let hash_str = hash.iter().map(|b| format!("{:02X}", b)).collect::<Vec<String>>().join("");
let hash_val = hash_str.trim_matches('0');
let hash_str = if negative {
"-".to_owned() + &hash_val[..]

View File

@ -13,8 +13,6 @@
// limitations under the License.
pub struct Atlas {
width: usize,
height: usize,
free_space: Vec<Rect>,
}
@ -29,8 +27,6 @@ pub struct Rect {
impl Atlas {
pub fn new(width: usize, height: usize) -> Atlas {
let mut a = Atlas {
width: width,
height: height,
free_space: Vec::new(),
};
a.free_space.push(Rect{

View File

@ -32,7 +32,6 @@ pub struct Renderer {
resource_version: usize,
pub resources: Arc<RwLock<resources::Manager>>,
textures: Arc<RwLock<TextureManager>>,
glsl: glsl::Registry,
pub ui: ui::UIState,
gl_texture: gl::Texture,
@ -62,7 +61,6 @@ impl Renderer {
Renderer {
resource_version: version,
textures: textures,
glsl: greg,
ui: ui,
resources: res,
gl_texture: tex,
@ -476,6 +474,7 @@ impl TextureManager {
}
}
#[allow(dead_code)]
struct AnimatedTexture {
frames: Vec<AnimationFrame>,
data: Vec<u8>,

View File

@ -41,10 +41,6 @@ pub struct UIState {
max_index: usize,
shader: gl::Program,
s_position: gl::Attribute,
s_texture_info: gl::Attribute,
s_texture_offset: gl::Attribute,
s_color: gl::Attribute,
s_texture: gl::Uniform,
s_screensize: gl::Uniform,
@ -113,10 +109,6 @@ impl UIState {
max_index: 0,
shader: shader,
s_position: s_position,
s_texture_info: s_texture_info,
s_texture_offset: s_texture_offset,
s_color: s_color,
s_texture: s_texture,
s_screensize: s_screensize,

View File

@ -7,10 +7,11 @@ use std::rc::Rc;
use render;
use ui;
#[allow(unused_variables)]
pub trait Screen {
// Called once
fn init(&mut self, renderer: &mut render::Renderer, ui_container: &mut ui::Container);
fn deinit(&mut self, renderer: &mut render::Renderer, ui_container: &mut ui::Container);
fn init(&mut self, _renderer: &mut render::Renderer, ui_container: &mut ui::Container) {}
fn deinit(&mut self, _renderer: &mut render::Renderer, ui_container: &mut ui::Container) {}
// May be called multiple times
fn on_active(&mut self, renderer: &mut render::Renderer, ui_container: &mut ui::Container);
@ -150,7 +151,7 @@ pub fn button_action(ui_container: &mut ui::Container,
click: Option<ui::ClickFunc>
) {
let batch = ui_container.get_mut(&btn);
batch.add_hover_func(Rc::new(move |over, screen_sys, renderer, ui_container| {
batch.add_hover_func(Rc::new(move |over, _, renderer, ui_container| {
let texture = render::Renderer::get_texture(renderer.get_textures_ref(), "gui/widgets").relative(
0.0, (if over { 86.0 } else { 66.0 }) / 256.0, 200.0 / 256.0, 20.0 / 256.0
);

View File

@ -83,6 +83,7 @@ impl ServerList {
let elements = self.elements.as_mut().unwrap();
*self.needs_reload.borrow_mut() = false;
{
// Clean up previous list entries and icons.
let mut tex = renderer.get_textures_ref().write().unwrap();
for server in &mut elements.servers {
server.collection.remove_all(ui_container);
@ -101,7 +102,9 @@ impl ServerList {
let servers = servers_info.find("servers").unwrap().as_array().unwrap();
let mut offset = 0.0;
// Default icon whilst we ping the servers or if the server doesn't provide one
let default_icon = render::Renderer::get_texture(renderer.get_textures_ref(), "misc/unknown_server");
// General gui icons
let icons = render::Renderer::get_texture(renderer.get_textures_ref(), "gui/icons");
for svr in servers {
@ -110,6 +113,7 @@ impl ServerList {
let solid = render::Renderer::get_texture(renderer.get_textures_ref(), "steven:solid");
// Everything is attached to this
let mut back = ui::Image::new(solid, 0.0, offset * 100.0, 700.0, 100.0, 0.0, 0.0, 1.0, 1.0, 0, 0, 0);
back.set_a(100);
back.set_v_attach(ui::VAttach::Middle);
@ -134,48 +138,55 @@ impl ServerList {
};
server.collection.add(server.back.clone());
server.update_position();
// Make whole entry interactable
{
let back = ui_container.get_mut(&server.back);
let back_ref = server.back.clone();
let address = address.clone();
back.add_hover_func(Rc::new(move |over, screen_sys, renderer, ui_container| {
back.add_hover_func(Rc::new(move |over, _, _, ui_container| {
let back = ui_container.get_mut(&back_ref);
back.set_a(if over { 200 } else { 100 });
}));
back.add_click_func(Rc::new(move |screen_sys, renderer, ui_container| {
back.add_click_func(Rc::new(move |_, _, _| {
println!("Connecting to {}", address);
}));
}
// Server name
let mut text = ui::Text::new(renderer, &name, 100.0, 5.0, 255, 255, 255);
text.set_parent(&server.back);
server.collection.add(ui_container.add(text));
// Server icon
let mut icon = ui::Image::new(default_icon.clone(), 5.0, 5.0, 90.0, 90.0, 0.0, 0.0, 1.0, 1.0, 255, 255, 255);
icon.set_parent(&server.back);
server.icon = server.collection.add(ui_container.add(icon));
// Ping indicator
let mut ping = ui::Image::new(icons.clone(), 5.0, 5.0, 20.0, 16.0, 0.0, 56.0/256.0, 10.0/256.0, 8.0/256.0, 255, 255, 255);
ping.set_h_attach(ui::HAttach::Right);
ping.set_parent(&server.back);
server.ping = server.collection.add(ui_container.add(ping));
// Player count
let mut players = ui::Text::new(renderer, "???", 30.0, 5.0, 255, 255, 255);
players.set_h_attach(ui::HAttach::Right);
players.set_parent(&server.back);
server.players = server.collection.add(ui_container.add(players));
// Server's message of the day
let mut motd = ui::Formatted::with_width_limit(renderer, Component::Text(TextComponent::new("Connecting...")), 100.0, 23.0, 700.0 - (90.0 + 10.0 + 5.0));
motd.set_parent(&server.back);
server.motd = server.collection.add(ui_container.add(motd));
// Version information
let mut version = ui::Formatted::with_width_limit(renderer, Component::Text(TextComponent::new("")), 100.0, 5.0, 700.0 - (90.0 + 10.0 + 5.0));
version.set_v_attach(ui::VAttach::Bottom);
version.set_parent(&server.back);
server.version = server.collection.add(ui_container.add(version));
// Delete entry button
let (mut del, mut txt) = super::new_button_text(renderer, "X", 0.0, 0.0, 25.0, 25.0);
del.set_v_attach(ui::VAttach::Bottom);
del.set_h_attach(ui::HAttach::Right);
@ -187,6 +198,7 @@ impl ServerList {
server.collection.add(re);
server.collection.add(tre);
// Edit entry button
let (mut edit, mut txt) = super::new_button_text(renderer, "E", 25.0, 0.0, 25.0, 25.0);
edit.set_v_attach(ui::VAttach::Bottom);
edit.set_h_attach(ui::HAttach::Right);
@ -201,6 +213,7 @@ impl ServerList {
elements.servers.push(server);
offset += 1.0;
// Don't block the main thread whilst pinging the server
thread::spawn(move || {
match protocol::Conn::new(&address).and_then(|conn| conn.do_status()) {
Ok(res) => {
@ -247,13 +260,11 @@ impl ServerList {
}
impl super::Screen for ServerList {
fn init(&mut self, renderer: &mut render::Renderer, ui_container: &mut ui::Container) {}
fn deinit(&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 logo = ui::logo::Logo::new(renderer.resources.clone(), renderer, ui_container);
let mut elements = ui::Collection::new();
// Refresh the server list
let (mut refresh, mut txt) = super::new_button_text(renderer, "Refresh", 300.0, -50.0-15.0, 100.0, 30.0);
refresh.set_v_attach(ui::VAttach::Middle);
refresh.set_h_attach(ui::HAttach::Center);
@ -261,12 +272,13 @@ impl super::Screen for ServerList {
txt.set_parent(&re);
let tre = ui_container.add(txt);
let nr = self.needs_reload.clone();
super::button_action(ui_container, re.clone(), Some(tre.clone()), Some(Rc::new(move |screen_sys, renderer, ui_container| {
super::button_action(ui_container, re.clone(), Some(tre.clone()), Some(Rc::new(move |_, _, _| {
*nr.borrow_mut() = true;
})));
elements.add(re);
elements.add(tre);
// Add a new server to the list
let (mut add, mut txt) = super::new_button_text(renderer, "Add", 200.0, -50.0-15.0, 100.0, 30.0);
add.set_v_attach(ui::VAttach::Middle);
add.set_h_attach(ui::HAttach::Center);
@ -277,6 +289,7 @@ impl super::Screen for ServerList {
elements.add(re);
elements.add(tre);
// Options menu
let mut options = super::new_button(renderer, 5.0, 25.0, 40.0, 40.0);
options.set_v_attach(ui::VAttach::Bottom);
options.set_h_attach(ui::HAttach::Right);
@ -288,12 +301,14 @@ impl super::Screen for ServerList {
super::button_action(ui_container, re.clone(), None, None);
elements.add(re);
elements.add(ui_container.add(cog));
// Disclaimer
let mut warn = ui::Text::new(renderer, "Not affiliated with Mojang/Minecraft", 5.0, 5.0, 255, 200, 200);
warn.set_v_attach(ui::VAttach::Bottom);
warn.set_h_attach(ui::HAttach::Right);
elements.add(ui_container.add(warn));
// If we are kicked from a server display the reason
if let Some(ref disconnect_reason) = self.disconnect_reason {
let mut dis_msg = ui::Text::new(renderer, "Disconnected", 0.0, 32.0, 255, 0, 0);
dis_msg.set_h_attach(ui::HAttach::Center);
@ -320,7 +335,8 @@ impl super::Screen for ServerList {
});
self.reload_server_list(renderer, ui_container);
}
fn on_deactive(&mut self, renderer: &mut render::Renderer, ui_container: &mut ui::Container) {
fn on_deactive(&mut self, _renderer: &mut render::Renderer, ui_container: &mut ui::Container) {
// Clean up
{
let elements = self.elements.as_mut().unwrap();
elements.logo.remove(ui_container);
@ -342,6 +358,7 @@ impl super::Screen for ServerList {
elements.logo.tick(renderer, ui_container);
for s in &mut elements.servers {
// Animate the entries
{
let back = ui_container.get_mut(&s.back);
let dy = s.y - back.get_y();
@ -353,6 +370,8 @@ impl super::Screen for ServerList {
}
}
// Keep checking to see if the server has finished being
// pinged
if !s.done_ping {
match s.recv.try_recv() {
Ok(res) => {
@ -363,6 +382,7 @@ impl super::Screen for ServerList {
}
{
let ping = ui_container.get_mut(&s.ping);
// Selects the icon for the given ping range
let y = match res.ping.num_milliseconds() {
_x @ 0 ... 75 => 16.0 / 256.0,
_x @ 76 ... 150 => 24.0 / 256.0,
@ -418,7 +438,7 @@ impl super::Screen for ServerList {
}
}
fn on_scroll(&mut self, x: f64, y: f64) {
fn on_scroll(&mut self, _: f64, y: f64) {
let elements = self.elements.as_mut().unwrap();
if elements.servers.is_empty() {
return;

View File

@ -60,6 +60,14 @@ impl Map {
map
}
pub fn resize(self, size: usize) -> Map {
let mut n = Map::new(self.length, size);
for i in 0 .. self.length {
n.set(i, self.get(i));
}
n
}
pub fn set(&mut self, i: usize, val: usize) {
let i = i * self.bit_size;
let pos = i / 64;
@ -74,7 +82,7 @@ impl Map {
}
}
pub fn get(&mut self, i: usize) -> usize {
pub fn get(&self, i: usize) -> usize {
let i = i * self.bit_size;
let pos = i / 64;
let mask = (1 << self.bit_size) - 1;

View File

@ -24,6 +24,7 @@ use self::byteorder::{BigEndian, WriteBytesExt, ReadBytesExt};
pub struct Position(u64);
impl Position {
#[allow(dead_code)]
fn new(x: i32, y: i32, z: i32) -> Position {
Position(
(((x as u64) & 0x3FFFFFF) << 38) |

View File

@ -590,9 +590,9 @@ impl Image {
})
}
fn update(&mut self, renderer: &mut render::Renderer) {}
fn update(&mut self, _: &mut render::Renderer) {}
fn draw(&mut self, renderer: &mut render::Renderer, r: &Region, width: f64, height: f64, delta: f64) -> &Vec<u8> {
fn draw(&mut self, renderer: &mut render::Renderer, r: &Region, width: f64, height: f64, _: f64) -> &Vec<u8> {
if self.dirty {
self.dirty = false;
self.texture = renderer.check_texture(self.texture.clone());
@ -681,7 +681,7 @@ impl Batch {
})
}
fn update(&mut self, renderer: &mut render::Renderer) {}
fn update(&mut self, _: &mut render::Renderer) {}
fn draw(&mut self, renderer: &mut render::Renderer, r: &Region, width: f64, height: f64, delta: f64) -> &Vec<u8> {
if self.dirty {
@ -788,7 +788,7 @@ impl Text {
self.width = renderer.ui.size_of_string(&self.val);
}
fn draw(&mut self, renderer: &mut render::Renderer, r: &Region, width: f64, height: f64, delta: f64) -> &Vec<u8> {
fn draw(&mut self, renderer: &mut render::Renderer, r: &Region, width: f64, height: f64, _: f64) -> &Vec<u8> {
if self.dirty {
self.dirty = false;
let sx = r.w / self.width;