Gotta move
This commit is contained in:
parent
f3617e61bc
commit
c155390e22
8 changed files with 218 additions and 123 deletions
|
@ -8,8 +8,8 @@ uniform sampler2D texture;
|
||||||
uniform vec2 screen_resolution;
|
uniform vec2 screen_resolution;
|
||||||
|
|
||||||
uniform vec2 curvature = vec2(3.0, 3.0);
|
uniform vec2 curvature = vec2(3.0, 3.0);
|
||||||
uniform vec2 scanline_opacity = vec2(1.0, 1.0);
|
uniform vec2 scanline_opacity = vec2(0.5, 0.5);
|
||||||
uniform float brightness = 3.0;
|
uniform float brightness = 2.0;
|
||||||
|
|
||||||
out vec4 f_color;
|
out vec4 f_color;
|
||||||
|
|
||||||
|
|
BIN
assets/textures/backgrounds/grass-hills.png
Normal file
BIN
assets/textures/backgrounds/grass-hills.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
0
assets/textures/tiles/atlas
Normal file
0
assets/textures/tiles/atlas
Normal file
153
src/assets.rs
Normal file
153
src/assets.rs
Normal file
|
@ -0,0 +1,153 @@
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use glium::{
|
||||||
|
texture::{RawImage2d, SrgbTexture2d},
|
||||||
|
Display, Program,
|
||||||
|
};
|
||||||
|
use glob::glob;
|
||||||
|
|
||||||
|
pub type Textures = HashMap<String, SrgbTexture2d>;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct TextureAtlas {
|
||||||
|
pub texture: SrgbTexture2d,
|
||||||
|
rects: HashMap<String, glium::Rect>,
|
||||||
|
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<String, Program>;
|
||||||
|
|
||||||
|
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),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
26
src/main.rs
26
src/main.rs
|
@ -1,21 +1,24 @@
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
|
|
||||||
use anymap::AnyMap;
|
use anymap::AnyMap;
|
||||||
|
use assets::{Assets, Shaders};
|
||||||
use cgmath::Matrix3;
|
use cgmath::Matrix3;
|
||||||
use glium::{
|
use glium::{
|
||||||
glutin, index::PrimitiveType, texture::Texture2d, uniform, Display, Frame, IndexBuffer,
|
glutin, index::PrimitiveType, texture::Texture2d, uniform, Display, Frame, IndexBuffer,
|
||||||
Surface, VertexBuffer,
|
Surface, VertexBuffer,
|
||||||
};
|
};
|
||||||
use glium_glyph::{glyph_brush::Section, GlyphBrush};
|
use glium_glyph::{
|
||||||
|
glyph_brush::{rusttype::Font, Section},
|
||||||
|
GlyphBrush,
|
||||||
|
};
|
||||||
use glutin::{
|
use glutin::{
|
||||||
event::{Event, WindowEvent},
|
event::{Event, WindowEvent},
|
||||||
event_loop::ControlFlow,
|
event_loop::ControlFlow,
|
||||||
};
|
};
|
||||||
use resources::Shaders;
|
|
||||||
use simplelog::{TermLogger, TerminalMode};
|
use simplelog::{TermLogger, TerminalMode};
|
||||||
use state::GameState;
|
use state::GameState;
|
||||||
|
|
||||||
pub mod resources;
|
pub mod assets;
|
||||||
pub mod state;
|
pub mod state;
|
||||||
|
|
||||||
const TIMESTEP: f32 = 1.0 / 20.0;
|
const TIMESTEP: f32 = 1.0 / 20.0;
|
||||||
|
@ -41,7 +44,7 @@ struct State {
|
||||||
current_state: Box<dyn GameState>,
|
current_state: Box<dyn GameState>,
|
||||||
next_state: Option<Box<dyn GameState>>,
|
next_state: Option<Box<dyn GameState>>,
|
||||||
|
|
||||||
resources: AnyMap,
|
resources: Assets,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl State {
|
impl State {
|
||||||
|
@ -83,12 +86,11 @@ impl State {
|
||||||
};
|
};
|
||||||
|
|
||||||
// Set initial 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;
|
let next_state = None;
|
||||||
|
|
||||||
// The resources map
|
// The resources map
|
||||||
let mut resources = AnyMap::new();
|
let resources = Assets::new(display);
|
||||||
resources::load_resources(display, &mut resources);
|
|
||||||
|
|
||||||
// Package it all together UwU
|
// Package it all together UwU
|
||||||
State {
|
State {
|
||||||
|
@ -130,7 +132,7 @@ impl State {
|
||||||
let render_indices =
|
let render_indices =
|
||||||
IndexBuffer::new(display, PrimitiveType::TriangleStrip, &[1, 2, 0, 3 as u16]).unwrap();
|
IndexBuffer::new(display, PrimitiveType::TriangleStrip, &[1, 2, 0, 3 as u16]).unwrap();
|
||||||
|
|
||||||
let program = self.resources.get::<Shaders>().unwrap().get("crt").unwrap();
|
let program = self.resources.shaders.get("crt").unwrap();
|
||||||
|
|
||||||
let mut scale = (1.0, 1.0);
|
let mut scale = (1.0, 1.0);
|
||||||
if self.screen_scale.0 < self.screen_scale.1 {
|
if self.screen_scale.0 < self.screen_scale.1 {
|
||||||
|
@ -143,7 +145,7 @@ impl State {
|
||||||
let uniforms = uniform! {
|
let uniforms = uniform! {
|
||||||
matrix: cgmath::conv::array3x3(scale_matrix),
|
matrix: cgmath::conv::array3x3(scale_matrix),
|
||||||
texture: self.render_texture.sampled().magnify_filter(glium::uniforms::MagnifySamplerFilter::Nearest),
|
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],
|
/*curvature: [3.0, 3.0 as f32],
|
||||||
scanline_opacity: [0.5, 0.5 as f32],
|
scanline_opacity: [0.5, 0.5 as f32],
|
||||||
brightness: 2.0 as f32,*/
|
brightness: 2.0 as f32,*/
|
||||||
|
@ -180,6 +182,11 @@ fn main() {
|
||||||
Display::new(wb, cb, &event_loop).unwrap()
|
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
|
// The main state of program or whatever
|
||||||
let mut state = State::new(&display);
|
let mut state = State::new(&display);
|
||||||
|
|
||||||
|
@ -220,7 +227,6 @@ fn main() {
|
||||||
state.render(&display, &mut target);
|
state.render(&display, &mut target);
|
||||||
|
|
||||||
// Draw the FPS Indicator
|
// Draw the FPS Indicator
|
||||||
let glyph_brush = state.resources.get_mut::<GlyphBrush>().unwrap();
|
|
||||||
glyph_brush.queue(Section {
|
glyph_brush.queue(Section {
|
||||||
text: &format!("FPS: {:?}", state.current_fps),
|
text: &format!("FPS: {:?}", state.current_fps),
|
||||||
screen_position: (0.0, 0.0),
|
screen_position: (0.0, 0.0),
|
||||||
|
|
|
@ -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<String, SrgbTexture2d>;
|
|
||||||
pub type Shaders = HashMap<String, Program>;
|
|
||||||
|
|
||||||
// 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<String, Program> = 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);
|
|
||||||
}
|
|
20
src/state.rs
20
src/state.rs
|
@ -4,26 +4,22 @@ use glium::{framebuffer::SimpleFrameBuffer, glutin::event::Event, Display, Frame
|
||||||
mod test_state;
|
mod test_state;
|
||||||
pub use test_state::TestState;
|
pub use test_state::TestState;
|
||||||
|
|
||||||
|
use crate::assets::Assets;
|
||||||
|
|
||||||
pub trait GameState {
|
pub trait GameState {
|
||||||
fn input(&mut self, resources: &mut AnyMap, event: &Event<()>);
|
fn input(&mut self, assets: &Assets, event: &Event<()>);
|
||||||
fn update(&mut self, resources: &mut AnyMap, dt: f32) -> Option<Box<dyn GameState>>;
|
fn update(&mut self, assets: &Assets, dt: f32) -> Option<Box<dyn GameState>>;
|
||||||
fn render(&mut self, resources: &mut AnyMap, display: &Display, target: &mut SimpleFrameBuffer);
|
fn render(&mut self, assets: &Assets, display: &Display, target: &mut SimpleFrameBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct DummyState;
|
pub struct DummyState;
|
||||||
|
|
||||||
impl GameState for DummyState {
|
impl GameState for DummyState {
|
||||||
fn update(&mut self, _resourcess: &mut AnyMap, _dt: f32) -> Option<Box<dyn GameState>> {
|
fn update(&mut self, _assets: &Assets, _dt: f32) -> Option<Box<dyn GameState>> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
fn input(&mut self, _resources: &mut AnyMap, _event: &Event<()>) {}
|
fn input(&mut self, _assets: &Assets, _event: &Event<()>) {}
|
||||||
|
|
||||||
fn render(
|
fn render(&mut self, _assets: &Assets, _display: &Display, _target: &mut SimpleFrameBuffer) {}
|
||||||
&mut self,
|
|
||||||
_resources: &mut AnyMap,
|
|
||||||
_display: &Display,
|
|
||||||
_target: &mut SimpleFrameBuffer,
|
|
||||||
) {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,24 +2,26 @@ use glium::{
|
||||||
framebuffer::SimpleFrameBuffer, implement_vertex, index::PrimitiveType, uniform,
|
framebuffer::SimpleFrameBuffer, implement_vertex, index::PrimitiveType, uniform,
|
||||||
uniforms::Sampler, IndexBuffer, Surface, VertexBuffer,
|
uniforms::Sampler, IndexBuffer, Surface, VertexBuffer,
|
||||||
};
|
};
|
||||||
use resources::Shaders;
|
|
||||||
|
|
||||||
use crate::resources::{self, Textures};
|
use crate::assets::Assets;
|
||||||
|
|
||||||
use super::GameState;
|
use super::GameState;
|
||||||
|
|
||||||
pub struct TestState;
|
pub struct TestState {
|
||||||
|
pub time: f32,
|
||||||
|
}
|
||||||
|
|
||||||
impl GameState for TestState {
|
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<Box<dyn GameState>> {
|
fn update(&mut self, assets: &Assets, dt: f32) -> Option<Box<dyn GameState>> {
|
||||||
|
self.time += 0.0;
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render(
|
fn render(
|
||||||
&mut self,
|
&mut self,
|
||||||
resources: &mut anymap::AnyMap,
|
assets: &Assets,
|
||||||
display: &glium::Display,
|
display: &glium::Display,
|
||||||
target: &mut SimpleFrameBuffer,
|
target: &mut SimpleFrameBuffer,
|
||||||
) {
|
) {
|
||||||
|
@ -33,24 +35,46 @@ impl GameState for TestState {
|
||||||
|
|
||||||
implement_vertex!(Vertex, position, tex_coords);
|
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(
|
VertexBuffer::new(
|
||||||
display,
|
display,
|
||||||
&[
|
&[
|
||||||
Vertex {
|
Vertex {
|
||||||
position: [-1.0, -1.0],
|
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 {
|
Vertex {
|
||||||
position: [-1.0, 1.0],
|
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 {
|
Vertex {
|
||||||
position: [1.0, 1.0],
|
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 {
|
Vertex {
|
||||||
position: [1.0, -1.0],
|
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 =
|
let index_buffer =
|
||||||
IndexBuffer::new(display, PrimitiveType::TriangleStrip, &[1 as u16, 2, 0, 3]).unwrap();
|
IndexBuffer::new(display, PrimitiveType::TriangleStrip, &[1 as u16, 2, 0, 3]).unwrap();
|
||||||
|
|
||||||
let program = resources.get::<Shaders>().unwrap().get("basic").unwrap();
|
let program = assets.shaders.get("basic").unwrap();
|
||||||
|
|
||||||
let texture = resources
|
|
||||||
.get::<Textures>()
|
|
||||||
.unwrap()
|
|
||||||
.get("tiles:dirt")
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let uniforms = uniform! {
|
let uniforms = uniform! {
|
||||||
/*matrix: [
|
matrix: cgmath::conv::array3x3(
|
||||||
[1.0,0.0,0.0],
|
cgmath::Matrix3::from_nonuniform_scale(1.0, 1.0 as f32)
|
||||||
[0.0,1.0,0.0],
|
),
|
||||||
[0.0,0.0,1.0 as f32],
|
texture: assets.texture_atlas.texture.sampled().magnify_filter(glium::uniforms::MagnifySamplerFilter::Nearest),
|
||||||
],*/
|
|
||||||
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),
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
target
|
target
|
||||||
|
|
Loading…
Reference in a new issue