use sevenx_engine::*;
struct Game3D {
renderer: Renderer3D,
camera: Camera3D,
cube: Mesh3D,
sphere: Mesh3D,
time: f32,
}
impl GameState for Game3D {
fn new() -> Self {
let renderer = Renderer3D::new(800, 600);
let mut camera = Camera3D::new(800, 600);
camera.position = Vec3::new(0.0, 2.0, 5.0);
camera.look_at(Vec3::zero());
let mut cube = Mesh3D::cube(1.0);
cube.position = Vec3::new(-2.0, 0.0, 0.0);
cube.set_color([255, 100, 100, 255]);
let mut sphere = Mesh3D::sphere(1.0, 16);
sphere.position = Vec3::new(2.0, 0.0, 0.0);
sphere.set_color([100, 100, 255, 255]);
Self {
renderer,
camera,
cube,
sphere,
time: 0.0,
}
}
fn update(&mut self, dt: f32, input: &input::InputHandler, _world: &mut world::World) {
self.time += dt;
self.cube.rotation.y = self.time;
self.sphere.rotation.x = self.time * 0.5;
let radius = 5.0;
self.camera.position.x = self.time.cos() * radius;
self.camera.position.z = self.time.sin() * radius;
self.camera.look_at(Vec3::zero());
if input.is_key_pressed(KeyCode::Escape) {
std::process::exit(0);
}
}
fn draw(&mut self, _world: &world::World, pixels: &mut [u8]) {
for pixel in pixels.chunks_exact_mut(4) {
pixel.copy_from_slice(&[20, 20, 30, 255]);
}
for z in &mut self.renderer.zbuffer {
*z = f32::INFINITY;
}
self.renderer.camera = self.camera.clone();
self.renderer.render_mesh(&self.cube, pixels, 800, 600);
self.renderer.render_mesh(&self.sphere, pixels, 800, 600);
ui::render_text(
"SevenX Engine - 3D Demo",
10, 10,
[255, 255, 255, 255],
pixels,
800
);
ui::render_text(
&format!("FPS: {:.0}", 1.0 / if dt > 0.0 { dt } else { 0.016 }),
10, 30,
[255, 255, 0, 255],
pixels,
800
);
ui::render_text(
"ESC: Sair",
10, 50,
[200, 200, 200, 255],
pixels,
800
);
}
}
fn main() {
let config = config::EngineConfig::new()
.with_title("3D Game - SevenX Engine")
.with_size(800, 600);
Engine::with_config(config).run::<Game3D>();
}