summaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/teleia/Cargo.toml36
-rw-r--r--crates/teleia/src/assets/shaders/uber/frag.glsl2
-rw-r--r--crates/teleia/src/assets/shaders/uber/vert.glsl7
-rw-r--r--crates/teleia/src/context.rs2
-rw-r--r--crates/teleia/src/renderer.rs30
-rw-r--r--crates/teleia/src/state.rs30
-rw-r--r--crates/teleia_macros/Cargo.toml8
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