From 569ffe54a44f0c5aa23ca97c20a4ac28121fd2bd Mon Sep 17 00:00:00 2001 From: LLLL Colonq Date: Sun, 4 Oct 2026 19:02:38 -0400 Subject: Fix GLB example, render scenes without joints --- .../examples/assets/fonts/ComicNeue-Regular.ttf | Bin 0 -> 54848 bytes crates/teleia/examples/assets/meshes/cube.obj | 38 +++++++++++ crates/teleia/examples/assets/scenes/dagger.glb | Bin 0 -> 13208 bytes crates/teleia/examples/assets/scenes/fox.glb | Bin 0 -> 162852 bytes crates/teleia/examples/assets/textures/test.png | Bin 0 -> 125 bytes crates/teleia/examples/fox.rs | 56 ++++++++++++++++ crates/teleia/src/assets/shaders/scene/vert.glsl | 3 + crates/teleia/src/scene.rs | 6 ++ examples/assets/fonts/ComicNeue-Regular.ttf | Bin 54848 -> 0 bytes examples/assets/meshes/cube.obj | 38 ----------- examples/assets/scenes/fox.glb | Bin 162852 -> 0 bytes examples/assets/textures/test.png | Bin 125 -> 0 bytes examples/fox.rs | 72 --------------------- 13 files changed, 103 insertions(+), 110 deletions(-) create mode 100644 crates/teleia/examples/assets/fonts/ComicNeue-Regular.ttf create mode 100644 crates/teleia/examples/assets/meshes/cube.obj create mode 100644 crates/teleia/examples/assets/scenes/dagger.glb create mode 100644 crates/teleia/examples/assets/scenes/fox.glb create mode 100644 crates/teleia/examples/assets/textures/test.png create mode 100644 crates/teleia/examples/fox.rs delete mode 100644 examples/assets/fonts/ComicNeue-Regular.ttf delete mode 100644 examples/assets/meshes/cube.obj delete mode 100644 examples/assets/scenes/fox.glb delete mode 100644 examples/assets/textures/test.png delete mode 100644 examples/fox.rs diff --git a/crates/teleia/examples/assets/fonts/ComicNeue-Regular.ttf b/crates/teleia/examples/assets/fonts/ComicNeue-Regular.ttf new file mode 100644 index 0000000..d454f46 Binary files /dev/null and b/crates/teleia/examples/assets/fonts/ComicNeue-Regular.ttf differ diff --git a/crates/teleia/examples/assets/meshes/cube.obj b/crates/teleia/examples/assets/meshes/cube.obj new file mode 100644 index 0000000..2f3a670 --- /dev/null +++ b/crates/teleia/examples/assets/meshes/cube.obj @@ -0,0 +1,38 @@ +# Blender 4.1.1 +# www.blender.org +o Cube +v 1.000000 1.000000 -1.000000 +v 1.000000 -1.000000 -1.000000 +v 1.000000 1.000000 1.000000 +v 1.000000 -1.000000 1.000000 +v -1.000000 1.000000 -1.000000 +v -1.000000 -1.000000 -1.000000 +v -1.000000 1.000000 1.000000 +v -1.000000 -1.000000 1.000000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vt 0.625000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 0.750000 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.125000 0.500000 +vt 0.375000 0.500000 +vt 0.125000 0.750000 +s 0 +f 1/1/1 5/2/1 7/3/1 3/4/1 +f 4/5/2 3/4/2 7/6/2 8/7/2 +f 8/8/3 7/9/3 5/10/3 6/11/3 +f 6/12/4 2/13/4 4/5/4 8/14/4 +f 2/13/5 1/1/5 3/4/5 4/5/5 +f 6/11/6 5/10/6 1/1/6 2/13/6 diff --git a/crates/teleia/examples/assets/scenes/dagger.glb b/crates/teleia/examples/assets/scenes/dagger.glb new file mode 100644 index 0000000..4eb8528 Binary files /dev/null and b/crates/teleia/examples/assets/scenes/dagger.glb differ diff --git a/crates/teleia/examples/assets/scenes/fox.glb b/crates/teleia/examples/assets/scenes/fox.glb new file mode 100644 index 0000000..1ef5c0d Binary files /dev/null and b/crates/teleia/examples/assets/scenes/fox.glb differ diff --git a/crates/teleia/examples/assets/textures/test.png b/crates/teleia/examples/assets/textures/test.png new file mode 100644 index 0000000..0752be0 Binary files /dev/null and b/crates/teleia/examples/assets/textures/test.png differ diff --git a/crates/teleia/examples/fox.rs b/crates/teleia/examples/fox.rs new file mode 100644 index 0000000..e0d0d5c --- /dev/null +++ b/crates/teleia/examples/fox.rs @@ -0,0 +1,56 @@ +use teleia::*; + +pub struct TestGame { + // cube: mesh::Mesh, + scene: scene::Scene, + tex: texture::Texture, + shader: shader::Shader, +} + +impl TestGame { + pub fn new(ctx: &context::Context, _st: &mut state::State) -> Self { + Self { + // cube: mesh::Mesh::from_obj(ctx, include_bytes!("assets/meshes/cube.obj")), + // fox: scene::Scene::from_gltf(ctx, include_bytes!("assets/scenes/fox.glb")), + scene: scene::Scene::from_gltf(ctx, include_bytes!("assets/scenes/dagger.glb")), + tex: texture::Texture::new(ctx, include_bytes!("assets/textures/test.png")), + shader: scene::Scene::load_default_shader(ctx), + } + } +} + +impl state::Game for TestGame { + fn update(&mut self, ctx: &context::Context, st: &mut state::State) -> Erm<()> { + st.move_camera( + ctx, + &glam::Vec3::new(0.0, 0.0, -1.0), + &glam::Vec3::new(0.0, 0.0, 1.0), + &glam::Vec3::new(0.0, 1.0, 0.0), + ); + Ok(()) + } + fn render(&mut self, ctx: &context::Context, st: &mut state::State) -> Erm<()> { + // if let Some(n) = self.fox.nodes_by_name.get("J_Bip_C_Neck").and_then(|i| self.fox.nodes.get_mut(*i)) { + // n.transform *= glam::Mat4::from_rotation_z(0.05); + // } + ctx.clear(); + // self.fox.reflect_animation("Run", (st.tick as f32 / 60.0).rem(3.0)); + st.bind_3d(ctx, &self.shader); + self.shader.set_position_3d( + ctx, st, + &glam::Mat4::from_scale_rotation_translation( + // glam::Vec3::new(0.005, 0.005, 0.005), + glam::Vec3::new(1.0, 1.0, 1.0), + glam::Quat::from_rotation_y(st.tick as f32 / 60.0), + glam::Vec3::new(0.0, -0.2, 0.0), + ), + ); + self.tex.bind(ctx); + self.scene.render(ctx, &self.shader); + Ok(()) + } +} + +pub fn main() -> Erm<()> { + run("teleia test", 240, 160, Options::empty(), TestGame::new) +} diff --git a/crates/teleia/src/assets/shaders/scene/vert.glsl b/crates/teleia/src/assets/shaders/scene/vert.glsl index 64f400c..5be64b9 100644 --- a/crates/teleia/src/assets/shaders/scene/vert.glsl +++ b/crates/teleia/src/assets/shaders/scene/vert.glsl @@ -1,6 +1,7 @@ in vec4 joint; in vec4 weight; +uniform int has_joints; uniform mat4 joint_matrices[128]; void main() @@ -12,7 +13,9 @@ void main() + weight.y * joint_matrices[int(joint.y)] + weight.z * joint_matrices[int(joint.z)] + weight.w * joint_matrices[int(joint.w)]; + if (has_joints == 0) skin = mat4(1.0); vec3 pos = (position * skin * vec4(vertex, 1.0)).xyz; + // vec3 pos = (position * vec4(vertex, 1.0)).xyz; vertex_view_vector = camera_pos - pos; gl_Position = projection * view * vec4(pos, 1.0); } diff --git a/crates/teleia/src/scene.rs b/crates/teleia/src/scene.rs index 26615fb..13b09ad 100644 --- a/crates/teleia/src/scene.rs +++ b/crates/teleia/src/scene.rs @@ -76,6 +76,7 @@ pub struct Scene { pub nodes: Vec, pub nodes_by_name: HashMap, pub scene_nodes: Vec, + pub has_joints: bool, } impl Scene { @@ -91,6 +92,7 @@ impl Scene { let get_buffer_data = |b: gltf::Buffer| { buffers.get(b.index()).map(|gltf::buffer::Data(bytes)| bytes.as_slice()) }; + let mut has_joints = false; let objects = gltf.meshes().map(|m| { let primitives = m.primitives().map(|p| { let mode = match p.mode() { @@ -163,11 +165,13 @@ impl Scene { } } if let Some(iter) = reader.read_joints(0) { + has_joints = true; for (i, j) in iter.into_u16().enumerate() { vertices[i].joints = glam::Vec4::from_slice(&j.into_iter().map(|x| x as f32).collect::>()) } } if let Some(iter) = reader.read_weights(0) { + has_joints = true; for (i, w) in iter.into_f32().enumerate() { vertices[i].weights = glam::Vec4::from_array(w) } @@ -318,6 +322,7 @@ impl Scene { nodes, nodes_by_name, scene_nodes, + has_joints, } } @@ -363,6 +368,7 @@ impl Scene { for sn in &self.scene_nodes { q.push_back(*sn); } + shader.set_i32(ctx, "has_joints", self.has_joints as i32); while let Some(ni) = q.pop_front() { let n = &self.nodes[ni]; self.render_node(ctx, shader, n); diff --git a/examples/assets/fonts/ComicNeue-Regular.ttf b/examples/assets/fonts/ComicNeue-Regular.ttf deleted file mode 100644 index d454f46..0000000 Binary files a/examples/assets/fonts/ComicNeue-Regular.ttf and /dev/null differ diff --git a/examples/assets/meshes/cube.obj b/examples/assets/meshes/cube.obj deleted file mode 100644 index 2f3a670..0000000 --- a/examples/assets/meshes/cube.obj +++ /dev/null @@ -1,38 +0,0 @@ -# Blender 4.1.1 -# www.blender.org -o Cube -v 1.000000 1.000000 -1.000000 -v 1.000000 -1.000000 -1.000000 -v 1.000000 1.000000 1.000000 -v 1.000000 -1.000000 1.000000 -v -1.000000 1.000000 -1.000000 -v -1.000000 -1.000000 -1.000000 -v -1.000000 1.000000 1.000000 -v -1.000000 -1.000000 1.000000 -vn -0.0000 1.0000 -0.0000 -vn -0.0000 -0.0000 1.0000 -vn -1.0000 -0.0000 -0.0000 -vn -0.0000 -1.0000 -0.0000 -vn 1.0000 -0.0000 -0.0000 -vn -0.0000 -0.0000 -1.0000 -vt 0.625000 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.750000 -vt 0.625000 0.750000 -vt 0.375000 0.750000 -vt 0.625000 1.000000 -vt 0.375000 1.000000 -vt 0.375000 0.000000 -vt 0.625000 0.000000 -vt 0.625000 0.250000 -vt 0.375000 0.250000 -vt 0.125000 0.500000 -vt 0.375000 0.500000 -vt 0.125000 0.750000 -s 0 -f 1/1/1 5/2/1 7/3/1 3/4/1 -f 4/5/2 3/4/2 7/6/2 8/7/2 -f 8/8/3 7/9/3 5/10/3 6/11/3 -f 6/12/4 2/13/4 4/5/4 8/14/4 -f 2/13/5 1/1/5 3/4/5 4/5/5 -f 6/11/6 5/10/6 1/1/6 2/13/6 diff --git a/examples/assets/scenes/fox.glb b/examples/assets/scenes/fox.glb deleted file mode 100644 index 1ef5c0d..0000000 Binary files a/examples/assets/scenes/fox.glb and /dev/null differ diff --git a/examples/assets/textures/test.png b/examples/assets/textures/test.png deleted file mode 100644 index 0752be0..0000000 Binary files a/examples/assets/textures/test.png and /dev/null differ diff --git a/examples/fox.rs b/examples/fox.rs deleted file mode 100644 index bfa97f0..0000000 --- a/examples/fox.rs +++ /dev/null @@ -1,72 +0,0 @@ -use teleia::*; - -use std::ops::Rem; - -pub struct TestGame { - font: font::Bitmap, - tt: font::TrueType, - // cube: mesh::Mesh, - fox: scene::Scene, - tex: texture::Texture, - shader: shader::Shader, -} - -impl TestGame { - pub async fn new(ctx: &context::Context) -> Self { - Self { - font: font::Bitmap::new(ctx), - tt: font::TrueType::new(ctx, 12.0, include_bytes!("assets/fonts/ComicNeue-Regular.ttf")), - // cube: mesh::Mesh::from_obj(ctx, include_bytes!("assets/meshes/cube.obj")), - fox: scene::Scene::from_gltf(ctx, include_bytes!("assets/scenes/fox.glb")), - // fox: scene::Scene::from_gltf(ctx, include_bytes!("/home/llll/src/colonq/assets/lcolonq_flat.vrm")), - tex: texture::Texture::new(ctx, include_bytes!("assets/textures/test.png")), - shader: scene::Scene::load_default_shader(ctx), - } - } -} - -impl state::Game for TestGame { - fn update(&mut self, ctx: &context::Context, st: &mut state::State) -> Erm<()> { - st.move_camera( - ctx, - &glam::Vec3::new(0.0, 0.0, -1.0), - &glam::Vec3::new(0.0, 0.0, 1.0), - &glam::Vec3::new(0.0, 1.0, 0.0), - ); - Ok(()) - } - fn render(&mut self, ctx: &context::Context, st: &mut state::State) -> Erm<()> { - // if let Some(n) = self.fox.nodes_by_name.get("J_Bip_C_Neck").and_then(|i| self.fox.nodes.get_mut(*i)) { - // n.transform *= glam::Mat4::from_rotation_z(0.05); - // } - ctx.clear(); - self.fox.reflect_animation("Run", (st.tick as f32 / 60.0).rem(3.0)); - st.bind_3d(ctx, &self.shader); - self.shader.set_position_3d( - ctx, - &glam::Mat4::from_scale_rotation_translation( - glam::Vec3::new(0.005, 0.005, 0.005), - // glam::Vec3::new(1.0, 1.0, 1.0), - glam::Quat::from_rotation_y(st.tick as f32 / 60.0), - glam::Vec3::new(0.0, -0.2, 0.0), - ), - ); - self.tex.bind(ctx); - self.fox.render(ctx, &self.shader); - self.font.render_text(ctx, &glam::Vec2::new(0.0, 10.0), "he's all FIXED up"); - self.tt.render_text_helper( - ctx, &glam::Vec2::new(10.0, 60.0), &glam::Vec2::new(20.0, 30.0), - "tESTge", - &[ - glam::Vec3::new(1.0, 0.0, 0.0), - glam::Vec3::new(0.0, 1.0, 0.0), - ], - ); - Ok(()) - } -} - -#[tokio::main] -pub async fn main() { - run("teleia test", 240, 160, Options::empty(), TestGame::new).await; -} -- cgit v1.3.1