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