summaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2026-10-04 19:02:38 -0400
committerLLLL Colonq <llll@colonq>2026-10-04 19:02:38 -0400
commit569ffe54a44f0c5aa23ca97c20a4ac28121fd2bd (patch)
treec0316f4ede0abb771023054870ab274bd83ef2e9 /crates
parent1c7d50579fbfa3f4d5796f192ffbf7b3fecbfe7f (diff)
Fix GLB example, render scenes without joints
Diffstat (limited to 'crates')
-rw-r--r--crates/teleia/examples/assets/fonts/ComicNeue-Regular.ttfbin0 -> 54848 bytes
-rw-r--r--crates/teleia/examples/assets/meshes/cube.obj38
-rw-r--r--crates/teleia/examples/assets/scenes/dagger.glbbin0 -> 13208 bytes
-rw-r--r--crates/teleia/examples/assets/scenes/fox.glbbin0 -> 162852 bytes
-rw-r--r--crates/teleia/examples/assets/textures/test.pngbin0 -> 125 bytes
-rw-r--r--crates/teleia/examples/fox.rs56
-rw-r--r--crates/teleia/src/assets/shaders/scene/vert.glsl3
-rw-r--r--crates/teleia/src/scene.rs6
8 files changed, 103 insertions, 0 deletions
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
--- /dev/null
+++ b/crates/teleia/examples/assets/fonts/ComicNeue-Regular.ttf
Binary files 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
--- /dev/null
+++ b/crates/teleia/examples/assets/scenes/dagger.glb
Binary files 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
--- /dev/null
+++ b/crates/teleia/examples/assets/scenes/fox.glb
Binary files 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
--- /dev/null
+++ b/crates/teleia/examples/assets/textures/test.png
Binary files 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<Node>,
pub nodes_by_name: HashMap<String, Index>,
pub scene_nodes: Vec<Index>,
+ 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::<Vec<f32>>())
}
}
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);