From c155390e22e5067b0a2beccf95b6cabdafde954d Mon Sep 17 00:00:00 2001 From: Hazel Rae Aranda Date: Tue, 9 Mar 2021 15:51:45 -0500 Subject: [PATCH] Gotta move --- assets/shaders/crt/frag.glsl | 4 +- assets/textures/backgrounds/grass-hills.png | Bin 0 -> 23350 bytes assets/textures/tiles/atlas | 0 src/assets.rs | 153 ++++++++++++++++++++ src/main.rs | 26 ++-- src/resources.rs | 74 ---------- src/state.rs | 20 +-- src/state/test_state.rs | 64 ++++---- 8 files changed, 218 insertions(+), 123 deletions(-) create mode 100644 assets/textures/backgrounds/grass-hills.png create mode 100644 assets/textures/tiles/atlas create mode 100644 src/assets.rs delete mode 100644 src/resources.rs diff --git a/assets/shaders/crt/frag.glsl b/assets/shaders/crt/frag.glsl index a320c80..621c9c9 100644 --- a/assets/shaders/crt/frag.glsl +++ b/assets/shaders/crt/frag.glsl @@ -8,8 +8,8 @@ uniform sampler2D texture; uniform vec2 screen_resolution; uniform vec2 curvature = vec2(3.0, 3.0); -uniform vec2 scanline_opacity = vec2(1.0, 1.0); -uniform float brightness = 3.0; +uniform vec2 scanline_opacity = vec2(0.5, 0.5); +uniform float brightness = 2.0; out vec4 f_color; diff --git a/assets/textures/backgrounds/grass-hills.png b/assets/textures/backgrounds/grass-hills.png new file mode 100644 index 0000000000000000000000000000000000000000..23a60c3a9ea9ec41b299091e17e969211315d32c GIT binary patch literal 23350 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 + +#[derive(Debug)] +pub struct TextureAtlas { + pub texture: SrgbTexture2d, + rects: HashMap, + width: u32, + height: u32, +} + +pub struct AtlasUVs { + pub bottom_left: [f32; 2], + pub bottom_right: [f32; 2], + pub top_left: [f32; 2], + pub top_right: [f32; 2], +} + +impl TextureAtlas { + fn new(display: &Display) -> TextureAtlas { + log::info!("Loading textures"); + let paths = glob("assets/textures/**/*.png").unwrap(); + let items = paths.map(|entry| { + let path = entry.unwrap(); + + let image = image::open(&path).unwrap().to_rgba8(); + let image_dimensions = image.dimensions(); + let image = image.into_raw(); + + let name_path = path + .with_extension("") + .strip_prefix("assets/textures/") + .unwrap() + .to_owned(); + let mut name = String::new(); + for part in name_path.iter() { + name.push_str(part.to_str().unwrap()); + name.push(':'); + } + name.pop(); + + crunch::Item::new( + (name, image), + image_dimensions.0 as usize, + image_dimensions.1 as usize, + crunch::Rotation::None, + ) + }); + + log::info!("Packing textures into atlas"); + let (width, height, items) = crunch::pack_into_po2(4096, items).unwrap(); + + let items = items.into_iter().map(|entry| { + let rect = glium::Rect { + left: entry.0.x as u32, + bottom: entry.0.y as u32, + width: entry.0.w as u32, + height: entry.0.h as u32, + }; + let name = entry.1 .0; + let image = entry.1 .1; + (name, image, rect) + }); + let mut atlas = TextureAtlas { + texture: SrgbTexture2d::empty(display, width as u32, height as u32).unwrap(), + rects: HashMap::new(), + width: width as u32, + height: height as u32, + }; + for (name, image, rect) in items { + atlas.texture.write( + rect, + RawImage2d::from_raw_rgba_reversed(&image, (rect.width, rect.height)), + ); + atlas.rects.insert(name, rect); + } + atlas + } + + pub fn get_uv(&self, name: String) -> AtlasUVs { + let rect = self.rects.get(&name).unwrap(); + AtlasUVs { + bottom_left: Self::coord_to_uv( + rect.left, + rect.bottom + rect.height, + self.width, + self.height, + ), + bottom_right: Self::coord_to_uv( + rect.left + rect.width, + rect.bottom + rect.height, + self.width, + self.height, + ), + top_left: Self::coord_to_uv(rect.left, rect.bottom, self.width, self.height), + top_right: Self::coord_to_uv( + rect.left + rect.width, + rect.bottom, + self.width, + self.height, + ), + } + } + + fn coord_to_uv(x: u32, y: u32, width: u32, height: u32) -> [f32; 2] { + [x as f32 / width as f32, (y as f32 / height as f32)] + } +} + +pub type Shaders = HashMap; + +fn load_shaders(display: &Display) -> Shaders { + log::info!("Loading shaders."); + let mut shaders: Shaders = Shaders::new(); + for entry in glob("assets/shaders/*").unwrap() { + if let Ok(path) = entry { + // Operate only on directories + if path.is_file() { + continue; + } + + let vert_source = std::fs::read_to_string(path.join("vert.glsl")).unwrap(); + let frag_source = std::fs::read_to_string(path.join("frag.glsl")).unwrap(); + let program = Program::from_source(display, &vert_source, &frag_source, None).unwrap(); + + let name = path.file_name().unwrap().to_str().unwrap().to_owned(); + shaders.insert(name.to_string(), program); + log::info!("Loaded shader {:?} from {:?}.", name, path); + } + } + shaders +} + +pub struct Assets { + pub texture_atlas: TextureAtlas, + pub shaders: Shaders, +} + +impl Assets { + pub fn new(display: &Display) -> Assets { + Assets { + texture_atlas: TextureAtlas::new(display), + shaders: load_shaders(display), + } + } +} diff --git a/src/main.rs b/src/main.rs index fcdb071..953c19a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,21 +1,24 @@ use std::time::{Duration, Instant}; use anymap::AnyMap; +use assets::{Assets, Shaders}; use cgmath::Matrix3; use glium::{ glutin, index::PrimitiveType, texture::Texture2d, uniform, Display, Frame, IndexBuffer, Surface, VertexBuffer, }; -use glium_glyph::{glyph_brush::Section, GlyphBrush}; +use glium_glyph::{ + glyph_brush::{rusttype::Font, Section}, + GlyphBrush, +}; use glutin::{ event::{Event, WindowEvent}, event_loop::ControlFlow, }; -use resources::Shaders; use simplelog::{TermLogger, TerminalMode}; use state::GameState; -pub mod resources; +pub mod assets; pub mod state; const TIMESTEP: f32 = 1.0 / 20.0; @@ -41,7 +44,7 @@ struct State { current_state: Box, next_state: Option>, - resources: AnyMap, + resources: Assets, } impl State { @@ -83,12 +86,11 @@ impl State { }; // Set initial state - let current_state = Box::new(state::TestState); + let current_state = Box::new(state::TestState { time: 0.0 }); let next_state = None; // The resources map - let mut resources = AnyMap::new(); - resources::load_resources(display, &mut resources); + let resources = Assets::new(display); // Package it all together UwU State { @@ -130,7 +132,7 @@ impl State { let render_indices = IndexBuffer::new(display, PrimitiveType::TriangleStrip, &[1, 2, 0, 3 as u16]).unwrap(); - let program = self.resources.get::().unwrap().get("crt").unwrap(); + let program = self.resources.shaders.get("crt").unwrap(); let mut scale = (1.0, 1.0); if self.screen_scale.0 < self.screen_scale.1 { @@ -143,7 +145,7 @@ impl State { let uniforms = uniform! { matrix: cgmath::conv::array3x3(scale_matrix), texture: self.render_texture.sampled().magnify_filter(glium::uniforms::MagnifySamplerFilter::Nearest), - screen_resolution: [SCREEN_WIDTH, SCREEN_HEIGHT], + screen_resolution: [SCREEN_HEIGHT, SCREEN_HEIGHT], /*curvature: [3.0, 3.0 as f32], scanline_opacity: [0.5, 0.5 as f32], brightness: 2.0 as f32,*/ @@ -180,6 +182,11 @@ fn main() { Display::new(wb, cb, &event_loop).unwrap() }; + // For font rendering + let dejavu = std::fs::read("assets/fonts/DejaVuSans.ttf").unwrap(); + let fonts = vec![Font::from_bytes(dejavu).unwrap()]; + let mut glyph_brush = GlyphBrush::new(&display, fonts); + // The main state of program or whatever let mut state = State::new(&display); @@ -220,7 +227,6 @@ fn main() { state.render(&display, &mut target); // Draw the FPS Indicator - let glyph_brush = state.resources.get_mut::().unwrap(); glyph_brush.queue(Section { text: &format!("FPS: {:?}", state.current_fps), screen_position: (0.0, 0.0), diff --git a/src/resources.rs b/src/resources.rs deleted file mode 100644 index 6b39354..0000000 --- a/src/resources.rs +++ /dev/null @@ -1,74 +0,0 @@ -use std::collections::HashMap; - -use anymap::AnyMap; -use glium::{texture::SrgbTexture2d, Display, Program}; -use glium_glyph::{glyph_brush::rusttype::Font, GlyphBrush}; -use glob::glob; - -pub type Textures = HashMap; -pub type Shaders = HashMap; - -// Set up and load all global resources. -pub fn load_resources(display: &Display, resources: &mut AnyMap) { - // Load images - log::info!("Loading textures"); - let mut textures: Textures = HashMap::new(); - for entry in glob("assets/textures/**/*.png").unwrap() { - use image::io::Reader; - - if let Ok(path) = entry { - let image = Reader::open(&path).unwrap().decode().unwrap().to_rgba8(); - let image_dimensions = image.dimensions(); - - let image = glium::texture::RawImage2d::from_raw_rgba_reversed( - &image.into_raw(), - image_dimensions, - ); - let texture = SrgbTexture2d::new(display, image).unwrap(); - - let name_path = path - .with_extension("") - .strip_prefix("assets/textures/") - .unwrap() - .to_owned(); - let mut name = String::new(); - for part in name_path.iter() { - name.push_str(part.to_str().unwrap()); - name.push(':'); - } - name.pop(); - - textures.insert(name.to_string(), texture); - log::info!("Loaded texture {:?} from {:?}.", name, path); - } - } - resources.insert(textures); - - // Load shaders - log::info!("Loading shaders."); - let mut shaders: HashMap = HashMap::new(); - for entry in glob("assets/shaders/*").unwrap() { - if let Ok(path) = entry { - // Operate only on directories - if path.is_file() { - continue; - } - - let vert_source = std::fs::read_to_string(path.join("vert.glsl")).unwrap(); - let frag_source = std::fs::read_to_string(path.join("frag.glsl")).unwrap(); - let program = Program::from_source(display, &vert_source, &frag_source, None).unwrap(); - - let name = path.file_name().unwrap().to_str().unwrap().to_owned(); - shaders.insert(name.to_string(), program); - log::info!("Loaded shader {:?} from {:?}.", name, path); - } - } - resources.insert(shaders); - - // Set up font stuff - let dejavu = std::fs::read("assets/fonts/DejaVuSans.ttf").unwrap(); - let fonts = vec![Font::from_bytes(dejavu).unwrap()]; - let glyph_brush = GlyphBrush::new(display, fonts); - log::info!("Set up font."); - resources.insert(glyph_brush); -} diff --git a/src/state.rs b/src/state.rs index 0354e4f..2c56313 100644 --- a/src/state.rs +++ b/src/state.rs @@ -4,26 +4,22 @@ use glium::{framebuffer::SimpleFrameBuffer, glutin::event::Event, Display, Frame mod test_state; pub use test_state::TestState; +use crate::assets::Assets; + pub trait GameState { - fn input(&mut self, resources: &mut AnyMap, event: &Event<()>); - fn update(&mut self, resources: &mut AnyMap, dt: f32) -> Option>; - fn render(&mut self, resources: &mut AnyMap, display: &Display, target: &mut SimpleFrameBuffer); + fn input(&mut self, assets: &Assets, event: &Event<()>); + fn update(&mut self, assets: &Assets, dt: f32) -> Option>; + fn render(&mut self, assets: &Assets, display: &Display, target: &mut SimpleFrameBuffer); } pub struct DummyState; impl GameState for DummyState { - fn update(&mut self, _resourcess: &mut AnyMap, _dt: f32) -> Option> { + fn update(&mut self, _assets: &Assets, _dt: f32) -> Option> { None } - fn input(&mut self, _resources: &mut AnyMap, _event: &Event<()>) {} + fn input(&mut self, _assets: &Assets, _event: &Event<()>) {} - fn render( - &mut self, - _resources: &mut AnyMap, - _display: &Display, - _target: &mut SimpleFrameBuffer, - ) { - } + fn render(&mut self, _assets: &Assets, _display: &Display, _target: &mut SimpleFrameBuffer) {} } diff --git a/src/state/test_state.rs b/src/state/test_state.rs index b215a9f..ed02ca2 100644 --- a/src/state/test_state.rs +++ b/src/state/test_state.rs @@ -2,24 +2,26 @@ use glium::{ framebuffer::SimpleFrameBuffer, implement_vertex, index::PrimitiveType, uniform, uniforms::Sampler, IndexBuffer, Surface, VertexBuffer, }; -use resources::Shaders; -use crate::resources::{self, Textures}; +use crate::assets::Assets; use super::GameState; -pub struct TestState; +pub struct TestState { + pub time: f32, +} impl GameState for TestState { - fn input(&mut self, resources: &mut anymap::AnyMap, event: &glium::glutin::event::Event<()>) {} + fn input(&mut self, assets: &Assets, event: &glium::glutin::event::Event<()>) {} - fn update(&mut self, resources: &mut anymap::AnyMap, dt: f32) -> Option> { + fn update(&mut self, assets: &Assets, dt: f32) -> Option> { + self.time += 0.0; None } fn render( &mut self, - resources: &mut anymap::AnyMap, + assets: &Assets, display: &glium::Display, target: &mut SimpleFrameBuffer, ) { @@ -33,24 +35,46 @@ impl GameState for TestState { implement_vertex!(Vertex, position, tex_coords); + let tex_coords = crate::assets::AtlasUVs { + top_left: [0.0, 0.0], + top_right: [1.0, 0.0], + bottom_left: [0.0, 1.0], + bottom_right: [1.0, 1.0], + }; + let tex_coords = assets + .texture_atlas + .get_uv("backgrounds:grass-hills".to_string()); + VertexBuffer::new( display, &[ Vertex { position: [-1.0, -1.0], - tex_coords: [0.0, 0.0], + tex_coords: [ + (tex_coords.top_left[0] - self.time.sin() / 8.0), + tex_coords.top_left[1], + ], }, Vertex { position: [-1.0, 1.0], - tex_coords: [0.0, 1.0], + tex_coords: [ + (tex_coords.bottom_left[0] - self.time.sin() / 8.0), + tex_coords.bottom_left[1], + ], }, Vertex { position: [1.0, 1.0], - tex_coords: [1.0, 1.0], + tex_coords: [ + (tex_coords.bottom_right[0] / 2.0 - self.time.sin() / 8.0), + tex_coords.bottom_right[1], + ], }, Vertex { position: [1.0, -1.0], - tex_coords: [1.0, 0.0], + tex_coords: [ + (tex_coords.top_right[0] / 2.0 - self.time.sin() / 8.0), + tex_coords.top_right[1], + ], }, ], ) @@ -60,23 +84,13 @@ impl GameState for TestState { let index_buffer = IndexBuffer::new(display, PrimitiveType::TriangleStrip, &[1 as u16, 2, 0, 3]).unwrap(); - let program = resources.get::().unwrap().get("basic").unwrap(); - - let texture = resources - .get::() - .unwrap() - .get("tiles:dirt") - .unwrap(); + let program = assets.shaders.get("basic").unwrap(); let uniforms = uniform! { - /*matrix: [ - [1.0,0.0,0.0], - [0.0,1.0,0.0], - [0.0,0.0,1.0 as f32], - ],*/ - matrix: cgmath::conv::array3x3(cgmath::Matrix3::from_nonuniform_scale(1.0/crate::SCREEN_WIDTH*16.0, 1.0/crate::SCREEN_HEIGHT*16.0)), - texture: texture.sampled().magnify_filter(glium::uniforms::MagnifySamplerFilter::Nearest), - + matrix: cgmath::conv::array3x3( + cgmath::Matrix3::from_nonuniform_scale(1.0, 1.0 as f32) + ), + texture: assets.texture_atlas.texture.sampled().magnify_filter(glium::uniforms::MagnifySamplerFilter::Nearest), }; target