spinning_cube/
spinning-cube.rs

1//! An example of a spinning cube with `view3d`
2use gemini_engine::{
3    core::ColChar,
4    fps_gameloop,
5    mesh3d::{Mesh3D, Transform3D, Vec3D},
6    view::View,
7    view3d::{DisplayMode, Light, Viewport},
8};
9use std::time::Duration;
10
11const FPS: f32 = 30.0;
12const FOV: f64 = 80.0;
13
14fn main() {
15    let mut view = View::new(100, 50, ColChar::EMPTY);
16
17    let mut viewport = Viewport::new(
18        Transform3D::look_at_lh(Vec3D::new(0.0, -1.5, 4.3), Vec3D::ZERO, Vec3D::Y),
19        FOV,
20        view.center(),
21    );
22    viewport.objects.push(Mesh3D::default_cube());
23
24    viewport.display_mode = DisplayMode::Illuminated {
25        lights: vec![
26            Light::new_ambient(0.3),
27            Light::new_directional(0.6, Vec3D::new(0.5, 1.0, 1.0)),
28        ],
29    };
30
31    fps_gameloop!(
32        {
33            viewport.objects[0].transform = viewport.objects[0]
34                .transform
35                .mul_mat4(&Transform3D::from_rotation_y(-0.05));
36        },
37        {
38            view.clear();
39            view.draw(&viewport);
40            let _ = view.display_render();
41        },
42        FPS,
43        |elapsed: Duration, frame_skip| {
44            println!(
45                "Elapsed: {:.2?}µs | Frame skip: {}",
46                elapsed.as_micros(),
47                frame_skip
48            );
49        }
50    );
51}