summaryrefslogtreecommitdiff
path: root/examples/fox.rs
blob: 33df561aa5cdea89504d1351615d2745cebb4d2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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) -> Option<()> {
        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),
        );
        Some(())
    }
    fn render(&mut self, ctx: &context::Context, st: &mut state::State) -> Option<()> {
        // 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),
            ],
        );
        Some(())
    }
}

#[tokio::main]
pub async fn main() {
    run("teleia test", 240, 160, Options::empty(), TestGame::new).await;
}