Initial?? Commit
This commit is contained in:
		
						commit
						82adc16b97
					
				
					 16 changed files with 2485 additions and 0 deletions
				
			
		
							
								
								
									
										22
									
								
								.cargo/config.toml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								.cargo/config.toml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,22 @@ | |||
| # Rename this file to `config.toml` to enable "fast build" configuration. Please read the notes below. | ||||
| 
 | ||||
| # NOTE: For maximum performance, build using a nightly compiler | ||||
| # If you are using rust stable, remove the "-Zshare-generics=y" below. | ||||
| 
 | ||||
| [target.x86_64-unknown-linux-gnu] | ||||
| linker = "/usr/bin/clang" | ||||
| rustflags = ["-Clink-arg=-fuse-ld=lld", "-Zshare-generics=y"] | ||||
| 
 | ||||
| # NOTE: you must manually install https://github.com/michaeleisel/zld on mac. you can easily do this with the "brew" package manager: | ||||
| # `brew install michaeleisel/zld/zld` | ||||
| [target.x86_64-apple-darwin] | ||||
| rustflags = ["-C", "link-arg=-fuse-ld=/usr/local/bin/zld", "-Zshare-generics=y", "-Zrun-dsymutil=no"] | ||||
| 
 | ||||
| [target.x86_64-pc-windows-msvc] | ||||
| linker = "rust-lld.exe" | ||||
| rustflags = ["-Zshare-generics=y"] | ||||
| 
 | ||||
| # Optional: Uncommenting the following improves compile times, but reduces the amount of debug info to 'line number tables only' | ||||
| # In most cases the gains are negligible, but if you are on macos and have slow compile times you should see significant gains. | ||||
| #[profile.dev] | ||||
| #debug = 1 | ||||
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| /target | ||||
							
								
								
									
										1704
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										1704
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										29
									
								
								Cargo.toml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								Cargo.toml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,29 @@ | |||
| [package] | ||||
| name = "digging" | ||||
| version = "0.1.0" | ||||
| authors = ["Hazel Snider <hazelra@disroot.org>"] | ||||
| edition = "2018" | ||||
| 
 | ||||
| # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html | ||||
| 
 | ||||
| [profile.dev.package.'*'] | ||||
| opt-level = 3 | ||||
| 
 | ||||
| [dependencies] | ||||
| log = "0.4.14" | ||||
| simplelog = "0.9.0" | ||||
| 
 | ||||
| glob = "0.3.0" | ||||
| anymap = "0.12.1" | ||||
| 
 | ||||
| glium = "0.29.0" | ||||
| cgmath = "0.18.0" | ||||
| crunch = "0.3.2" | ||||
| glium-glyph = "0.10.0" | ||||
| 
 | ||||
| hecs = "0.3.1" | ||||
| 
 | ||||
| [dependencies.image] | ||||
| version = "0.23.13" | ||||
| default-features = false | ||||
| features = ["png"] | ||||
							
								
								
									
										187
									
								
								assets/fonts/DejaVu-LICENSE.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								assets/fonts/DejaVu-LICENSE.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,187 @@ | |||
| Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. | ||||
| Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) | ||||
| 
 | ||||
| 
 | ||||
| Bitstream Vera Fonts Copyright | ||||
| ------------------------------ | ||||
| 
 | ||||
| Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is | ||||
| a trademark of Bitstream, Inc. | ||||
| 
 | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of the fonts accompanying this license ("Fonts") and associated | ||||
| documentation files (the "Font Software"), to reproduce and distribute the | ||||
| Font Software, including without limitation the rights to use, copy, merge, | ||||
| publish, distribute, and/or sell copies of the Font Software, and to permit | ||||
| persons to whom the Font Software is furnished to do so, subject to the | ||||
| following conditions: | ||||
| 
 | ||||
| The above copyright and trademark notices and this permission notice shall | ||||
| be included in all copies of one or more of the Font Software typefaces. | ||||
| 
 | ||||
| The Font Software may be modified, altered, or added to, and in particular | ||||
| the designs of glyphs or characters in the Fonts may be modified and | ||||
| additional glyphs or characters may be added to the Fonts, only if the fonts | ||||
| are renamed to names not containing either the words "Bitstream" or the word | ||||
| "Vera". | ||||
| 
 | ||||
| This License becomes null and void to the extent applicable to Fonts or Font | ||||
| Software that has been modified and is distributed under the "Bitstream | ||||
| Vera" names. | ||||
| 
 | ||||
| The Font Software may be sold as part of a larger software package but no | ||||
| copy of one or more of the Font Software typefaces may be sold by itself. | ||||
| 
 | ||||
| THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | ||||
| OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, | ||||
| TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME | ||||
| FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING | ||||
| ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, | ||||
| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF | ||||
| THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE | ||||
| FONT SOFTWARE. | ||||
| 
 | ||||
| Except as contained in this notice, the names of Gnome, the Gnome | ||||
| Foundation, and Bitstream Inc., shall not be used in advertising or | ||||
| otherwise to promote the sale, use or other dealings in this Font Software | ||||
| without prior written authorization from the Gnome Foundation or Bitstream | ||||
| Inc., respectively. For further information, contact: fonts at gnome dot | ||||
| org. | ||||
| 
 | ||||
| Arev Fonts Copyright | ||||
| ------------------------------ | ||||
| 
 | ||||
| Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. | ||||
| 
 | ||||
| Permission is hereby granted, free of charge, to any person obtaining | ||||
| a copy of the fonts accompanying this license ("Fonts") and | ||||
| associated documentation files (the "Font Software"), to reproduce | ||||
| and distribute the modifications to the Bitstream Vera Font Software, | ||||
| including without limitation the rights to use, copy, merge, publish, | ||||
| distribute, and/or sell copies of the Font Software, and to permit | ||||
| persons to whom the Font Software is furnished to do so, subject to | ||||
| the following conditions: | ||||
| 
 | ||||
| The above copyright and trademark notices and this permission notice | ||||
| shall be included in all copies of one or more of the Font Software | ||||
| typefaces. | ||||
| 
 | ||||
| The Font Software may be modified, altered, or added to, and in | ||||
| particular the designs of glyphs or characters in the Fonts may be | ||||
| modified and additional glyphs or characters may be added to the | ||||
| Fonts, only if the fonts are renamed to names not containing either | ||||
| the words "Tavmjong Bah" or the word "Arev". | ||||
| 
 | ||||
| This License becomes null and void to the extent applicable to Fonts | ||||
| or Font Software that has been modified and is distributed under the  | ||||
| "Tavmjong Bah Arev" names. | ||||
| 
 | ||||
| The Font Software may be sold as part of a larger software package but | ||||
| no copy of one or more of the Font Software typefaces may be sold by | ||||
| itself. | ||||
| 
 | ||||
| THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF | ||||
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT | ||||
| OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL | ||||
| TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | ||||
| INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL | ||||
| DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||||
| FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM | ||||
| OTHER DEALINGS IN THE FONT SOFTWARE. | ||||
| 
 | ||||
| Except as contained in this notice, the name of Tavmjong Bah shall not | ||||
| be used in advertising or otherwise to promote the sale, use or other | ||||
| dealings in this Font Software without prior written authorization | ||||
| from Tavmjong Bah. For further information, contact: tavmjong @ free | ||||
| . fr. | ||||
| 
 | ||||
| TeX Gyre DJV Math | ||||
| ----------------- | ||||
| Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. | ||||
| 
 | ||||
| Math extensions done by B. Jackowski, P. Strzelczyk and P. Pianowski | ||||
| (on behalf of TeX users groups) are in public domain. | ||||
| 
 | ||||
| Letters imported from Euler Fraktur from AMSfonts are (c) American | ||||
| Mathematical Society (see below). | ||||
| Bitstream Vera Fonts Copyright | ||||
| Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera | ||||
| is a trademark of Bitstream, Inc. | ||||
| 
 | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of the fonts accompanying this license (“Fonts”) and associated | ||||
| documentation | ||||
| files (the “Font Software”), to reproduce and distribute the Font Software, | ||||
| including without limitation the rights to use, copy, merge, publish, | ||||
| distribute, | ||||
| and/or sell copies of the Font Software, and to permit persons  to whom | ||||
| the Font Software is furnished to do so, subject to the following | ||||
| conditions: | ||||
| 
 | ||||
| The above copyright and trademark notices and this permission notice | ||||
| shall be | ||||
| included in all copies of one or more of the Font Software typefaces. | ||||
| 
 | ||||
| The Font Software may be modified, altered, or added to, and in particular | ||||
| the designs of glyphs or characters in the Fonts may be modified and | ||||
| additional | ||||
| glyphs or characters may be added to the Fonts, only if the fonts are | ||||
| renamed | ||||
| to names not containing either the words “Bitstream” or the word “Vera”. | ||||
| 
 | ||||
| This License becomes null and void to the extent applicable to Fonts or | ||||
| Font Software | ||||
| that has been modified and is distributed under the “Bitstream Vera” | ||||
| names. | ||||
| 
 | ||||
| The Font Software may be sold as part of a larger software package but | ||||
| no copy | ||||
| of one or more of the Font Software typefaces may be sold by itself. | ||||
| 
 | ||||
| THE FONT SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS | ||||
| OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, | ||||
| TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME | ||||
| FOUNDATION | ||||
| BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, | ||||
| SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN | ||||
| ACTION | ||||
| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR | ||||
| INABILITY TO USE | ||||
| THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. | ||||
| Except as contained in this notice, the names of GNOME, the GNOME | ||||
| Foundation, | ||||
| and Bitstream Inc., shall not be used in advertising or otherwise to promote | ||||
| the sale, use or other dealings in this Font Software without prior written | ||||
| authorization from the GNOME Foundation or Bitstream Inc., respectively. | ||||
| For further information, contact: fonts at gnome dot org. | ||||
| 
 | ||||
| AMSFonts (v. 2.2) copyright | ||||
| 
 | ||||
| The PostScript Type 1 implementation of the AMSFonts produced by and | ||||
| previously distributed by Blue Sky Research and Y&Y, Inc. are now freely | ||||
| available for general use. This has been accomplished through the | ||||
| cooperation | ||||
| of a consortium of scientific publishers with Blue Sky Research and Y&Y. | ||||
| Members of this consortium include: | ||||
| 
 | ||||
| Elsevier Science IBM Corporation Society for Industrial and Applied | ||||
| Mathematics (SIAM) Springer-Verlag American Mathematical Society (AMS) | ||||
| 
 | ||||
| In order to assure the authenticity of these fonts, copyright will be | ||||
| held by | ||||
| the American Mathematical Society. This is not meant to restrict in any way | ||||
| the legitimate use of the fonts, such as (but not limited to) electronic | ||||
| distribution of documents containing these fonts, inclusion of these fonts | ||||
| into other public domain or commercial font collections or computer | ||||
| applications, use of the outline data to create derivative fonts and/or | ||||
| faces, etc. However, the AMS does require that the AMS copyright notice be | ||||
| removed from any derivative versions of the fonts which have been altered in | ||||
| any way. In addition, to ensure the fidelity of TeX documents using Computer | ||||
| Modern fonts, Professor Donald Knuth, creator of the Computer Modern faces, | ||||
| has requested that any alterations which yield different font metrics be | ||||
| given a different name. | ||||
| 
 | ||||
| $Id$ | ||||
							
								
								
									
										
											BIN
										
									
								
								assets/fonts/DejaVuSans.ttf
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/fonts/DejaVuSans.ttf
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										12
									
								
								assets/shaders/basic/frag.glsl
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								assets/shaders/basic/frag.glsl
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | |||
| #version 330 core | ||||
| precision lowp float; | ||||
| 
 | ||||
| in vec2 v_tex_coords; | ||||
| 
 | ||||
| uniform sampler2D texture; | ||||
| 
 | ||||
| out vec4 f_color; | ||||
| 
 | ||||
| void main() { | ||||
|     f_color = vec4(texture2D(texture, v_tex_coords).rgb, 1.0); | ||||
| } | ||||
							
								
								
									
										13
									
								
								assets/shaders/basic/vert.glsl
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								assets/shaders/basic/vert.glsl
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,13 @@ | |||
| #version 330 core | ||||
| 
 | ||||
| uniform mat3 matrix; | ||||
| 
 | ||||
| in vec2 position; | ||||
| in vec2 tex_coords; | ||||
| 
 | ||||
| out lowp vec2 v_tex_coords; | ||||
| 
 | ||||
| void main() { | ||||
|     gl_Position = vec4(matrix * vec3(position, 1.0), 1.0); | ||||
|     v_tex_coords = tex_coords; | ||||
| } | ||||
							
								
								
									
										46
									
								
								assets/shaders/crt/frag.glsl
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								assets/shaders/crt/frag.glsl
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,46 @@ | |||
| #version 330 core | ||||
| precision lowp float; | ||||
| 
 | ||||
| in vec2 v_tex_coords; | ||||
| 
 | ||||
| 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; | ||||
| 
 | ||||
| out vec4 f_color; | ||||
| 
 | ||||
| const float PI = 3.14159; | ||||
| 
 | ||||
| vec2 curve_uv(vec2 uv) { | ||||
|     uv = uv * 2.0 - 1.0; | ||||
|     vec2 offset = abs(uv.yx) / vec2(curvature.x, curvature.y); | ||||
|     uv = uv + uv * offset * offset; | ||||
|     uv = uv * 0.5 + 0.5; | ||||
|     return uv; | ||||
| } | ||||
| 
 | ||||
| vec3 scanline_intensity(float uv, float resolution, float opacity) { | ||||
|     float intensity = sin(uv * resolution * PI * 2.0); | ||||
|     intensity = ((0.5 * intensity) + 0.5) * 0.9 + 0.1; | ||||
|     return vec3(pow(intensity, opacity)); | ||||
| } | ||||
| 
 | ||||
| void main() { | ||||
|     vec2 curved_uv = curve_uv(v_tex_coords); | ||||
|     vec3 base_color = texture2D(texture, curved_uv).rgb; | ||||
| 
 | ||||
|     base_color += vec3(1.0/256.0); | ||||
|     base_color *= scanline_intensity(curved_uv.x, screen_resolution.y, scanline_opacity.x); | ||||
|     base_color *= scanline_intensity(curved_uv.y, screen_resolution.x, scanline_opacity.y); | ||||
|     base_color *= vec3(brightness); | ||||
| 
 | ||||
|     if (curved_uv.x < 0.0 || curved_uv.y < 0.0 || curved_uv.x > 1.0 || curved_uv.y > 1.0) { | ||||
|         f_color = vec4(0.0, 0.0, 0.0, 1.0); | ||||
|     } else { | ||||
|         f_color = vec4(base_color, 1.0); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										14
									
								
								assets/shaders/crt/vert.glsl
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								assets/shaders/crt/vert.glsl
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,14 @@ | |||
| #version 330 core | ||||
| 
 | ||||
| uniform mat3 matrix; | ||||
| 
 | ||||
| in vec2 position; | ||||
| in vec2 tex_coords; | ||||
| 
 | ||||
| out lowp vec2 v_tex_coords; | ||||
| 
 | ||||
| void main() { | ||||
|     gl_Position = vec4(matrix * vec3(position, 1.0), 1.0); | ||||
| 
 | ||||
|     v_tex_coords = tex_coords; | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								assets/textures/tiles/dirt.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/textures/tiles/dirt.png
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 694 B | 
							
								
								
									
										
											BIN
										
									
								
								assets/textures/tiles/stone.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/textures/tiles/stone.png
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 729 B | 
							
								
								
									
										262
									
								
								src/main.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										262
									
								
								src/main.rs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,262 @@ | |||
| use std::time::{Duration, Instant}; | ||||
| 
 | ||||
| use anymap::AnyMap; | ||||
| use cgmath::Matrix3; | ||||
| use glium::{ | ||||
|     glutin, index::PrimitiveType, texture::Texture2d, uniform, Display, Frame, IndexBuffer, | ||||
|     Surface, VertexBuffer, | ||||
| }; | ||||
| use glium_glyph::{glyph_brush::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 state; | ||||
| 
 | ||||
| const TIMESTEP: f32 = 1.0 / 20.0; | ||||
| const SCREEN_WIDTH: f32 = 320.0; | ||||
| const SCREEN_HEIGHT: f32 = 240.0; | ||||
| 
 | ||||
| #[derive(Clone, Copy)] | ||||
| struct Vertex { | ||||
|     position: [f32; 2], | ||||
|     tex_coords: [f32; 2], | ||||
| } | ||||
| 
 | ||||
| glium::implement_vertex!(Vertex, position, tex_coords); | ||||
| 
 | ||||
| // Where overall state is kept.
 | ||||
| struct State { | ||||
|     current_fps: u32, | ||||
| 
 | ||||
|     render_texture: Texture2d, | ||||
|     render_vertices: VertexBuffer<Vertex>, | ||||
|     screen_scale: (f32, f32), | ||||
| 
 | ||||
|     current_state: Box<dyn GameState>, | ||||
|     next_state: Option<Box<dyn GameState>>, | ||||
| 
 | ||||
|     resources: AnyMap, | ||||
| } | ||||
| 
 | ||||
| impl State { | ||||
|     fn new(display: &Display) -> State { | ||||
|         // FPS thingies
 | ||||
|         let current_fps = 0; | ||||
| 
 | ||||
|         let render_texture = | ||||
|             Texture2d::empty(display, SCREEN_WIDTH as u32, SCREEN_HEIGHT as u32).unwrap(); | ||||
|         let render_vertices = VertexBuffer::new( | ||||
|             display, | ||||
|             &[ | ||||
|                 Vertex { | ||||
|                     position: [-1.0, -1.0], | ||||
|                     tex_coords: [0.0, 0.0], | ||||
|                 }, | ||||
|                 Vertex { | ||||
|                     position: [-1.0, 1.0], | ||||
|                     tex_coords: [0.0, 1.0], | ||||
|                 }, | ||||
|                 Vertex { | ||||
|                     position: [1.0, 1.0], | ||||
|                     tex_coords: [1.0, 1.0], | ||||
|                 }, | ||||
|                 Vertex { | ||||
|                     position: [1.0, -1.0], | ||||
|                     tex_coords: [1.0, 0.0], | ||||
|                 }, | ||||
|             ], | ||||
|         ) | ||||
|         .unwrap(); | ||||
| 
 | ||||
|         let screen_scale = { | ||||
|             let size = display.gl_window().window().inner_size(); | ||||
|             ( | ||||
|                 size.height as f32 / SCREEN_HEIGHT * SCREEN_WIDTH / size.width as f32, | ||||
|                 size.width as f32 / SCREEN_WIDTH * SCREEN_HEIGHT / size.height as f32, | ||||
|             ) | ||||
|         }; | ||||
| 
 | ||||
|         // Set initial state
 | ||||
|         let current_state = Box::new(state::TestState); | ||||
|         let next_state = None; | ||||
| 
 | ||||
|         // The resources map
 | ||||
|         let mut resources = AnyMap::new(); | ||||
|         resources::load_resources(display, &mut resources); | ||||
| 
 | ||||
|         // Package it all together UwU
 | ||||
|         State { | ||||
|             current_fps, | ||||
|             render_texture, | ||||
|             render_vertices, | ||||
|             screen_scale, | ||||
|             current_state, | ||||
|             next_state, | ||||
|             resources, | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     fn input(&mut self, event: &Event<()>) { | ||||
|         self.current_state.input(&mut self.resources, event); | ||||
|     } | ||||
| 
 | ||||
|     fn update(&mut self, dt: f32) { | ||||
|         // Swap state if new one is present
 | ||||
|         let mut next_state = None; | ||||
|         std::mem::swap(&mut next_state, &mut self.next_state); | ||||
|         if let Some(state) = next_state { | ||||
|             self.current_state = state; | ||||
|         } | ||||
| 
 | ||||
|         // Run current state's update
 | ||||
|         self.next_state = self.current_state.update(&mut self.resources, dt); | ||||
|     } | ||||
| 
 | ||||
|     fn render(&mut self, display: &Display, target: &mut Frame) { | ||||
|         { | ||||
|             let mut texture_target = self.render_texture.as_surface(); | ||||
|             texture_target.clear_color_srgb(0.0, 0.0, 0.0, 1.0); | ||||
| 
 | ||||
|             self.current_state | ||||
|                 .render(&mut self.resources, display, &mut texture_target); | ||||
|         } | ||||
| 
 | ||||
|         let render_indices = | ||||
|             IndexBuffer::new(display, PrimitiveType::TriangleStrip, &[1, 2, 0, 3 as u16]).unwrap(); | ||||
| 
 | ||||
|         let program = self.resources.get::<Shaders>().unwrap().get("crt").unwrap(); | ||||
| 
 | ||||
|         let mut scale = (1.0, 1.0); | ||||
|         if self.screen_scale.0 < self.screen_scale.1 { | ||||
|             scale.0 = self.screen_scale.0; | ||||
|         } else { | ||||
|             scale.1 = self.screen_scale.1; | ||||
|         } | ||||
|         let scale_matrix = Matrix3::from_nonuniform_scale(scale.0, scale.1); | ||||
| 
 | ||||
|         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], | ||||
|             /*curvature: [3.0, 3.0 as f32],
 | ||||
|             scanline_opacity: [0.5, 0.5 as f32], | ||||
|             brightness: 2.0 as f32,*/ | ||||
|         }; | ||||
| 
 | ||||
|         target | ||||
|             .draw( | ||||
|                 &self.render_vertices, | ||||
|                 &render_indices, | ||||
|                 program, | ||||
|                 &uniforms, | ||||
|                 &Default::default(), | ||||
|             ) | ||||
|             .unwrap(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| // It is the entrypoint, duh.
 | ||||
| fn main() { | ||||
|     // Set up the logger
 | ||||
|     TermLogger::init( | ||||
|         log::LevelFilter::Info, | ||||
|         simplelog::Config::default(), | ||||
|         TerminalMode::Mixed, | ||||
|     ) | ||||
|     .unwrap(); | ||||
|     log::info!("Logger is set up!"); | ||||
| 
 | ||||
|     // Set up windowing and graphics context
 | ||||
|     let event_loop = glutin::event_loop::EventLoop::new(); | ||||
|     let display = { | ||||
|         let wb = glutin::window::WindowBuilder::new(); | ||||
|         let cb = glutin::ContextBuilder::new().with_vsync(true); | ||||
|         Display::new(wb, cb, &event_loop).unwrap() | ||||
|     }; | ||||
| 
 | ||||
|     // The main state of program or whatever
 | ||||
|     let mut state = State::new(&display); | ||||
| 
 | ||||
|     // Timing stuff
 | ||||
|     let mut last_update = Instant::now(); | ||||
|     let mut update_accumulator = 0.0; | ||||
|     let mut next_fps_check = Instant::now() + Duration::from_secs(1); | ||||
|     let mut frame_counter: u32 = 0; | ||||
| 
 | ||||
|     // Run the main event loop
 | ||||
|     event_loop.run(move |event, _, control_flow| { | ||||
|         *control_flow = ControlFlow::Poll; | ||||
| 
 | ||||
|         match event { | ||||
|             // Stuff to happen every frame.
 | ||||
|             Event::MainEventsCleared => { | ||||
|                 // Game timestep and state update stuff.
 | ||||
|                 update_accumulator += last_update.elapsed().as_secs_f32(); | ||||
|                 last_update = Instant::now(); | ||||
|                 while update_accumulator >= TIMESTEP { | ||||
|                     update_accumulator -= TIMESTEP; | ||||
|                     state.update(TIMESTEP); | ||||
|                 } | ||||
| 
 | ||||
|                 // Measure framerate
 | ||||
|                 let now = Instant::now(); | ||||
|                 frame_counter += 1; | ||||
|                 if now >= next_fps_check { | ||||
|                     state.current_fps = frame_counter; | ||||
|                     frame_counter = 0; | ||||
|                     next_fps_check = now + Duration::from_secs(1); | ||||
|                 } | ||||
| 
 | ||||
|                 // Let us render some shit!
 | ||||
|                 let mut target = display.draw(); | ||||
|                 target.clear_color_srgb(0.0, 0.0, 0.0, 1.0); | ||||
| 
 | ||||
|                 state.render(&display, &mut target); | ||||
| 
 | ||||
|                 // Draw the FPS Indicator
 | ||||
|                 let glyph_brush = state.resources.get_mut::<GlyphBrush>().unwrap(); | ||||
|                 glyph_brush.queue(Section { | ||||
|                     text: &format!("FPS: {:?}", state.current_fps), | ||||
|                     screen_position: (0.0, 0.0), | ||||
|                     color: [1.0, 1.0, 1.0, 1.0], | ||||
|                     ..Default::default() | ||||
|                 }); | ||||
|                 glyph_brush.draw_queued(&display, &mut target); | ||||
| 
 | ||||
|                 target.finish().unwrap(); | ||||
|             } | ||||
| 
 | ||||
|             Event::WindowEvent { | ||||
|                 event: WindowEvent::Resized(size), | ||||
|                 .. | ||||
|             } => { | ||||
|                 state.screen_scale = ( | ||||
|                     size.height as f32 / SCREEN_HEIGHT * SCREEN_WIDTH / size.width as f32, | ||||
|                     size.width as f32 / SCREEN_WIDTH * SCREEN_HEIGHT / size.height as f32, | ||||
|                 ); | ||||
|             } | ||||
| 
 | ||||
|             // Quit if window wants to be closed
 | ||||
|             // TODO: Check state to see if allowed to exit.
 | ||||
|             Event::WindowEvent { | ||||
|                 event: WindowEvent::CloseRequested, | ||||
|                 .. | ||||
|             } => { | ||||
|                 *control_flow = ControlFlow::Exit; | ||||
|             } | ||||
| 
 | ||||
|             // Cleanup here
 | ||||
|             Event::LoopDestroyed => {} | ||||
| 
 | ||||
|             event => { | ||||
|                 state.input(&event); | ||||
|             } | ||||
|         } | ||||
|     }); | ||||
| } | ||||
							
								
								
									
										74
									
								
								src/resources.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								src/resources.rs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,74 @@ | |||
| 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); | ||||
| } | ||||
							
								
								
									
										29
									
								
								src/state.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/state.rs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,29 @@ | |||
| use anymap::AnyMap; | ||||
| use glium::{framebuffer::SimpleFrameBuffer, glutin::event::Event, Display, Frame, Surface}; | ||||
| 
 | ||||
| mod test_state; | ||||
| pub use test_state::TestState; | ||||
| 
 | ||||
| pub trait GameState { | ||||
|     fn input(&mut self, resources: &mut AnyMap, event: &Event<()>); | ||||
|     fn update(&mut self, resources: &mut AnyMap, dt: f32) -> Option<Box<dyn GameState>>; | ||||
|     fn render(&mut self, resources: &mut AnyMap, display: &Display, target: &mut SimpleFrameBuffer); | ||||
| } | ||||
| 
 | ||||
| pub struct DummyState; | ||||
| 
 | ||||
| impl GameState for DummyState { | ||||
|     fn update(&mut self, _resourcess: &mut AnyMap, _dt: f32) -> Option<Box<dyn GameState>> { | ||||
|         None | ||||
|     } | ||||
| 
 | ||||
|     fn input(&mut self, _resources: &mut AnyMap, _event: &Event<()>) {} | ||||
| 
 | ||||
|     fn render( | ||||
|         &mut self, | ||||
|         _resources: &mut AnyMap, | ||||
|         _display: &Display, | ||||
|         _target: &mut SimpleFrameBuffer, | ||||
|     ) { | ||||
|     } | ||||
| } | ||||
							
								
								
									
										92
									
								
								src/state/test_state.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								src/state/test_state.rs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,92 @@ | |||
| use glium::{ | ||||
|     framebuffer::SimpleFrameBuffer, implement_vertex, index::PrimitiveType, uniform, | ||||
|     uniforms::Sampler, IndexBuffer, Surface, VertexBuffer, | ||||
| }; | ||||
| use resources::Shaders; | ||||
| 
 | ||||
| use crate::resources::{self, Textures}; | ||||
| 
 | ||||
| use super::GameState; | ||||
| 
 | ||||
| pub struct TestState; | ||||
| 
 | ||||
| impl GameState for TestState { | ||||
|     fn input(&mut self, resources: &mut anymap::AnyMap, event: &glium::glutin::event::Event<()>) {} | ||||
| 
 | ||||
|     fn update(&mut self, resources: &mut anymap::AnyMap, dt: f32) -> Option<Box<dyn GameState>> { | ||||
|         None | ||||
|     } | ||||
| 
 | ||||
|     fn render( | ||||
|         &mut self, | ||||
|         resources: &mut anymap::AnyMap, | ||||
|         display: &glium::Display, | ||||
|         target: &mut SimpleFrameBuffer, | ||||
|     ) { | ||||
|         // Make vertex buffer
 | ||||
|         let vertex_buffer = { | ||||
|             #[derive(Clone, Copy)] | ||||
|             struct Vertex { | ||||
|                 position: [f32; 2], | ||||
|                 tex_coords: [f32; 2], | ||||
|             } | ||||
| 
 | ||||
|             implement_vertex!(Vertex, position, tex_coords); | ||||
| 
 | ||||
|             VertexBuffer::new( | ||||
|                 display, | ||||
|                 &[ | ||||
|                     Vertex { | ||||
|                         position: [-1.0, -1.0], | ||||
|                         tex_coords: [0.0, 0.0], | ||||
|                     }, | ||||
|                     Vertex { | ||||
|                         position: [-1.0, 1.0], | ||||
|                         tex_coords: [0.0, 1.0], | ||||
|                     }, | ||||
|                     Vertex { | ||||
|                         position: [1.0, 1.0], | ||||
|                         tex_coords: [1.0, 1.0], | ||||
|                     }, | ||||
|                     Vertex { | ||||
|                         position: [1.0, -1.0], | ||||
|                         tex_coords: [1.0, 0.0], | ||||
|                     }, | ||||
|                 ], | ||||
|             ) | ||||
|             .unwrap() | ||||
|         }; | ||||
| 
 | ||||
|         let index_buffer = | ||||
|             IndexBuffer::new(display, PrimitiveType::TriangleStrip, &[1 as u16, 2, 0, 3]).unwrap(); | ||||
| 
 | ||||
|         let program = resources.get::<Shaders>().unwrap().get("basic").unwrap(); | ||||
| 
 | ||||
|         let texture = resources | ||||
|             .get::<Textures>() | ||||
|             .unwrap() | ||||
|             .get("tiles:dirt") | ||||
|             .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), | ||||
| 
 | ||||
|         }; | ||||
| 
 | ||||
|         target | ||||
|             .draw( | ||||
|                 &vertex_buffer, | ||||
|                 &index_buffer, | ||||
|                 program, | ||||
|                 &uniforms, | ||||
|                 &Default::default(), | ||||
|             ) | ||||
|             .unwrap(); | ||||
|     } | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue