diff options
Diffstat (limited to 'crates')
| -rw-r--r-- | crates/teleia/Cargo.toml | 36 | ||||
| -rw-r--r-- | crates/teleia/src/assets/shaders/uber/frag.glsl | 2 | ||||
| -rw-r--r-- | crates/teleia/src/assets/shaders/uber/vert.glsl | 7 | ||||
| -rw-r--r-- | crates/teleia/src/context.rs | 2 | ||||
| -rw-r--r-- | crates/teleia/src/renderer.rs | 30 | ||||
| -rw-r--r-- | crates/teleia/src/state.rs | 30 | ||||
| -rw-r--r-- | crates/teleia_macros/Cargo.toml | 8 |
7 files changed, 72 insertions, 43 deletions
diff --git a/crates/teleia/Cargo.toml b/crates/teleia/Cargo.toml index 0889a8e..05ec74a 100644 --- a/crates/teleia/Cargo.toml +++ b/crates/teleia/Cargo.toml @@ -8,28 +8,28 @@ authors.workspace = true crate-type = ["cdylib", "rlib"] [dependencies] -strum = { version = "*", features = ["derive"] } # utility macros for enums +strum = { version = "0.27.1", features = ["derive"] } # utility macros for enums glow = { version = "=0.13.1", features = [] } # rendering -tobj = "*" # loader for .obj meshes loader +tobj = "4.0.1" # loader for .obj meshes loader gltf = { git = "https://github.com/lcolonq/gltf", features = ["extras", "import", "names", "utils"] } # loader for .gltf scenes -image = { version = "0.25", default-features = false, features = ["jpeg", "png"] } # texture loader -cosmic-text = { version = "*", default-features = false, features = ["std", "swash"] } # advanced text rendering -glam = "0.29" # linear algebra -log = "*" # logging +image = { version = "0.25.10", default-features = false, features = ["jpeg", "png"] } # texture loader +# cosmic-text = { version = "*", default-features = false, features = ["std", "swash"] } # advanced text rendering +glam = "0.29.2" # linear algebra +log = "0.4.21" # logging rand = { version = "=0.8.5", features = ["small_rng"] } # rng -serde = { version = "*", features = ["derive"] } # serialization -serde_json = "*" # serialize JSON -bincode = { version = "*", features = ["serde"] } # binary serialization -enum-map = "*" # fast maps with enums as keys -bimap = "*" # bijective maps +serde = { version = "1.0.228", features = ["derive"] } # serialization +serde_json = "1.0.128" # serialize JSON +bincode = { version = "2.0.1", features = ["serde"] } # binary serialization +enum-map = "2.7.3" # fast maps with enums as keys +bimap = "0.6.3" # bijective maps # reqwest = "*" # http requests bytes = "*" # bytes for http responses -bitflags = { version = "*", features = ["serde"] } # bitwise flags -simple-eyre = { version = "*", default-features = false } # error reporting and formatting -rapier3d = "*" # rigid-body physics -parry3d = "*" # collision detection +bitflags = { version = "2.6.0", features = ["serde"] } # bitwise flags +simple-eyre = { version = "0.3.1", default-features = false } # error reporting and formatting +rapier3d = "0.23.1" # rigid-body physics +parry3d = "0.18.0" # collision detection nalgebra = {version = "0.33.2", features = ["convert-glam029"]} # linear algebra library for rapier3d -byteorder = "*" # read numbers in particular endianness +byteorder = "1.5.0" # read numbers in particular endianness base64 = "0.22.1" # encode/decode base64 [target.'cfg(target_arch = "wasm32")'.dependencies] @@ -44,9 +44,9 @@ js-sys = "*" # browser APIs to interact with JS runtime (e.g. run WASM) web-sys = { version = "*", features = ["Document", "Window", "Element", "HtmlCanvasElement", "WebGl2RenderingContext", "Headers", "Request", "RequestInit", "RequestMode", "Response", "Performance", "PerformanceTiming", "AudioContext", "AudioNode", "GainNode", "AudioParam", "AudioDestinationNode", "AudioBuffer", "AudioBufferSourceNode", "BinaryType", "Blob", "CloseEvent", "ErrorEvent", "FileReader", "MessageEvent", "ProgressEvent", "WebSocket", "Storage"] } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -env_logger = "*" # configurable logging to stdout +env_logger = "0.11.5" # configurable logging to stdout glfw = { git = "https://github.com/lcolonq/glfw-rs", features = ["serde"] } # window management kira = { version = "=0.9.6", default-features = false, features = ["cpal", "ogg", "wav"] } # audio directories = { git = "https://github.com/lcolonq/directories-rs" } # standard system directories -polling = "*" # interface to epoll +polling = "3.11.0" # interface to epoll tungstenite = { version = "0.24.0", features = ["native-tls"] } # websockets
\ No newline at end of file diff --git a/crates/teleia/src/assets/shaders/uber/frag.glsl b/crates/teleia/src/assets/shaders/uber/frag.glsl index ccdb346..ebe6438 100644 --- a/crates/teleia/src/assets/shaders/uber/frag.glsl +++ b/crates/teleia/src/assets/shaders/uber/frag.glsl @@ -1,4 +1,4 @@ -uniform int flags; +uniform highp int flags; uniform vec3 camera_pos; uniform float time; diff --git a/crates/teleia/src/assets/shaders/uber/vert.glsl b/crates/teleia/src/assets/shaders/uber/vert.glsl index 15223a0..b9be83b 100644 --- a/crates/teleia/src/assets/shaders/uber/vert.glsl +++ b/crates/teleia/src/assets/shaders/uber/vert.glsl @@ -1,5 +1,4 @@ -#version 300 es -precision highp float; +uniform highp int flags; in vec3 vertex; in vec3 normal; @@ -19,6 +18,10 @@ out vec3 vertex_fragpos; out vec4 vertex_fragpos_shadow_dir; out vec3 vertex_view_vector; +bool flag(int mask) { + return (flags & mask) != 0; +} + void main() { vertex_texcoord = texcoord; vertex_normal = (normal_matrix * vec4(normal, 1.0)).xyz; diff --git a/crates/teleia/src/context.rs b/crates/teleia/src/context.rs index 602e2cc..8547d59 100644 --- a/crates/teleia/src/context.rs +++ b/crates/teleia/src/context.rs @@ -101,7 +101,7 @@ impl Context { self.gl.clear_color(0.1, 0.1, 0.1, 1.0); self.gl.clear_depth_f32(1.0); - #[cfg(debug_assertions)] + #[cfg(all(debug_assertions, not(target_arch = "wasm32")))] self.gl.enable(glow::DEBUG_OUTPUT); self.gl.enable(glow::DEPTH_TEST); diff --git a/crates/teleia/src/renderer.rs b/crates/teleia/src/renderer.rs index d40c0cd..8313319 100644 --- a/crates/teleia/src/renderer.rs +++ b/crates/teleia/src/renderer.rs @@ -5,14 +5,15 @@ use bitflags::bitflags; bitflags! { #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub struct UberFlags: u32 { - const TEXTURE_COLOR = 0b00000001; - const TEXTURE_NORMAL = 0b00000010; - const FLIP_TEXTURE = 0b00000100; - const LIGHT_AMBIENT = 0b00001000; - const LIGHT_DIR = 0b00010000; - const LIGHT_POINT = 0b00100000; - const SPRITE = 0b01000000; - const EFFECTS = 0b10000000; + const TEXTURE_COLOR = 0b000000001; + const TEXTURE_NORMAL = 0b000000010; + const FLIP_TEXTURE = 0b000000100; + const LIGHT_AMBIENT = 0b000001000; + const LIGHT_DIR = 0b000010000; + const LIGHT_POINT = 0b000100000; + const SPRITE = 0b001000000; + const EFFECTS = 0b010000000; + const SCREENSPACE = 0b100000000; } } impl UberFlags { @@ -41,7 +42,7 @@ pub trait Assets { } #[derive(Debug, Clone, Copy, PartialEq, Eq)] -enum ShaderMode { TwoDimension, ThreeDimension, } +enum ShaderMode { TwoDimension, ThreeDimension, ThreeDimensionOrth } #[derive(Debug, Clone, Copy)] enum BoundShader<A: Assets> { None, Uber(UberFlags, ShaderMode), Shader(A::Shader, ShaderMode) } impl<A: Assets> PartialEq for BoundShader<A> { @@ -76,7 +77,7 @@ impl<A: Assets> Renderer<A> { pub fn new<F>(ctx: &context::Context, f: F) -> Self where F: FnOnce(&context::Context) -> A { let shader_uber = shader::Shader::new_nolib(ctx, - include_str!("assets/shaders/uber/vert.glsl"), + &format!("{}{}", UberFlags::prelude(), include_str!("assets/shaders/uber/vert.glsl")), &format!("{}{}", UberFlags::prelude(), include_str!("assets/shaders/uber/frag.glsl")), ); shader_uber.bind(ctx); @@ -121,6 +122,7 @@ impl<A: Assets> Renderer<A> { match mode { ShaderMode::TwoDimension => st.bind_2d(ctx, &self.shader_uber), ShaderMode::ThreeDimension => st.bind_3d(ctx, &self.shader_uber), + ShaderMode::ThreeDimensionOrth => st.bind_3d_orth(ctx, &self.shader_uber), } flags.set_flags(ctx, &self.shader_uber); self.shader = BoundShader::Uber(flags, mode) @@ -137,6 +139,7 @@ impl<A: Assets> Renderer<A> { match mode { ShaderMode::TwoDimension => st.bind_2d(ctx, &self.assets.shader(shader)), ShaderMode::ThreeDimension => st.bind_3d(ctx, &self.assets.shader(shader)), + ShaderMode::ThreeDimensionOrth => st.bind_3d_orth(ctx, &self.assets.shader(shader)), } self.shader = BoundShader::Shader(shader, mode) } @@ -146,6 +149,9 @@ impl<A: Assets> Renderer<A> { pub fn bind_uber_3d(&mut self, ctx: &context::Context, st: &mut state::State, flags: UberFlags) { self.bind_uber(ctx, st, flags, ShaderMode::ThreeDimension); } + pub fn bind_uber_3d_orth(&mut self, ctx: &context::Context, st: &mut state::State, flags: UberFlags) { + self.bind_uber(ctx, st, flags, ShaderMode::ThreeDimensionOrth); + } pub fn bind_shader_2d(&mut self, ctx: &context::Context, st: &mut state::State, shader: A::Shader) { self.bind_shader(ctx, st, shader, ShaderMode::TwoDimension); } @@ -166,7 +172,9 @@ impl<A: Assets> Renderer<A> { } pub fn set_position_3d(&self, ctx: &context::Context, st: &state::State, pos: glam::Mat4) { if let Some((s, sm)) = self.shader() { - debug_assert!(sm == ShaderMode::ThreeDimension, "attempted to set_position_3d in wrong mode"); + debug_assert!(sm == ShaderMode::ThreeDimension || sm == ShaderMode::ThreeDimensionOrth, + "attempted to set_position_3d in wrong mode" + ); s.set_position_3d(ctx, st, &pos) } } diff --git a/crates/teleia/src/state.rs b/crates/teleia/src/state.rs index 2b23ae7..7544356 100644 --- a/crates/teleia/src/state.rs +++ b/crates/teleia/src/state.rs @@ -10,6 +10,9 @@ use crate::{audio, context, font, framebuffer, mesh, shader, utils}; const DELTA_TIME: f64 = 0.016; // todo +pub const ORTH_WIDTH: f32 = 7.55869; +pub const ORTH_HEIGHT: f32 = 5.03913; + pub trait Game { fn initialize(&mut self, ctx: &context::Context, st: &mut State) -> utils::Erm<()> { Ok(()) } fn finalize(&mut self, ctx: &context::Context, st: &mut State) -> utils::Erm<()> { Ok(()) } @@ -171,6 +174,7 @@ pub struct State { pub audio: Option<audio::Assets>, pub projection: glam::Mat4, + pub projection_orth: glam::Mat4, pub camera: (glam::Vec3, glam::Vec3, glam::Vec3), pub lighting: (glam::Vec3, glam::Vec3, glam::Vec3), pub point_lights: Vec<PointLight>, @@ -272,6 +276,12 @@ impl State { 0.5, 50.0, ), + projection_orth: glam::Mat4::orthographic_lh( + -ORTH_WIDTH, ORTH_WIDTH, + -ORTH_HEIGHT, ORTH_HEIGHT, + 0.5, + 50.0, + ), camera: (glam::Vec3::new(0.0, 0.0, 0.0), glam::Vec3::new(0.0, 0.0, 1.0), glam::Vec3::new(0.0, 1.0, 0.0)), lighting: ( glam::Vec3::new(1.0, 1.0, 1.0), @@ -358,9 +368,9 @@ impl State { ) } - pub fn bind_3d_helper(&mut self, ctx: &context::Context, shader: &shader::Shader, plc: usize) { + pub fn bind_3d_helper(&mut self, ctx: &context::Context, shader: &shader::Shader, plc: usize, orth: bool) { shader.bind(ctx); - shader.set_mat4(ctx, "projection", &self.projection); + shader.set_mat4(ctx, "projection", if orth { &self.projection_orth } else { &self.projection }); shader.set_mat4(ctx, "view", &self.view()); shader.set_vec3( ctx, "light_ambient_color", @@ -381,12 +391,12 @@ impl State { } pub fn bind_3d_no_point_lights(&mut self, ctx: &context::Context, shader: &shader::Shader) { - self.bind_3d_helper(ctx, shader, 0); + self.bind_3d_helper(ctx, shader, 0, false); } - pub fn bind_3d(&mut self, ctx: &context::Context, shader: &shader::Shader) { + pub fn bind_3d_with_point_lights(&mut self, ctx: &context::Context, shader: &shader::Shader, orth: bool) { let plc = self.point_lights.len().min(5); - self.bind_3d_helper(ctx, shader, plc); + self.bind_3d_helper(ctx, shader, plc, orth); if plc > 0 { let lpos: Vec<_> = self.point_lights.iter().take(plc).map(|l| l.pos).collect(); shader.set_vec3_array( @@ -406,6 +416,14 @@ impl State { } } + pub fn bind_3d(&mut self, ctx: &context::Context, shader: &shader::Shader) { + self.bind_3d_with_point_lights(ctx, shader, false) + } + + pub fn bind_3d_orth(&mut self, ctx: &context::Context, shader: &shader::Shader) { + self.bind_3d_with_point_lights(ctx, shader, true) + } + pub fn bind_2d(&mut self, ctx: &context::Context, shader: &shader::Shader) { shader.bind(ctx); shader.set_mat4(&ctx, "projection", &glam::Mat4::IDENTITY); @@ -536,7 +554,7 @@ impl State { self.shader_upscale.bind(&ctx); self.render_framebuffer.bind_texture(&ctx); ctx.render_no_geometry(); - #[cfg(debug_assertions)] + #[cfg(all(debug_assertions, not(target_arch = "wasm32")))] { let err = unsafe { ctx.gl.get_error() }; if err != glow::NO_ERROR { diff --git a/crates/teleia_macros/Cargo.toml b/crates/teleia_macros/Cargo.toml index a3d4fe6..eb8cfd7 100644 --- a/crates/teleia_macros/Cargo.toml +++ b/crates/teleia_macros/Cargo.toml @@ -8,7 +8,7 @@ authors.workspace = true proc-macro = true [dependencies] -env = "*" -walkdir = "*" -heck = "*" -litrs = "*"
\ No newline at end of file +env = "1.0.1" +walkdir = "2.5.0" +heck = "0.5.0" +litrs = "1.0.0"
\ No newline at end of file |
