use std::{f32::consts::PI, time::Instant};
use matrix_engine::{
engine::{
entity::Entity,
events::{MatrixEvent, MatrixEventable},
plugins::{window_plugin::WindowPlugin, Plugin},
query::{ReadE, ReadSystemID, WriteC, WriteE, WriteR},
runtimes::single_threaded::SingleThreaded,
transform::Transform,
Engine, EngineArgs,
},
math::matrix::{Vector3, Vector4},
renderer::{
camera::Camera, pipelines::models::{cube::Cube, square::Square}, render_object::RenderObject,
renderer_plugin::RendererPlugin,
},
};
use winit::keyboard::KeyCode;
struct Example1;
impl<CustomEvents: MatrixEventable> Plugin<CustomEvents> for Example1 {
fn build(&self, scene: &mut matrix_engine::engine::scene::Scene<CustomEvents>) {
let mut latest = Instant::now();
let mut v = Vec::<f32>::new();
let mut latest_second = Instant::now();
scene.add_send_system(
move |(events, write_events, id): &mut (
ReadE<CustomEvents>,
WriteE<CustomEvents>,
ReadSystemID,
)| {
let now = Instant::now();
v.push(1.0 / (now - latest).as_secs_f32());
if (now - latest_second).as_secs() > 0 {
let fps = v.iter().sum::<f32>() / v.len() as f32;
println!("fps: {:10.5}, {:10.5}", fps, 1.0 / fps);
latest_second = now;
}
latest = now;
if events.is_just_pressed(KeyCode::KeyW) {
write_events.send(MatrixEvent::DestroySystem(**id)).unwrap();
}
},
);
scene.add_send_startup_system(
|render_objs: &mut WriteC<RenderObject>,
transforms: &mut WriteC<Transform>,
camera: &mut WriteR<Camera, CustomEvents>| {
for i in 0..100 {
for y in 0..100 {
for z in 0..100 {
let e = Entity::new();
render_objs
.insert(e, RenderObject::new(Cube, "./img.jpg".to_string()));
transforms.insert(
e,
Transform::new_position(Vector3::new(
5.0 * i as f32,
5.0 * y as f32,
5.0 * z as f32,
)),
);
}
}
}
camera.insert_and_notify(Camera {
eye: Vector3::new(0.0, 0.0, -1.),
dir: Vector3::new(1., 0., 0.),
up: Vector3::new(0., 1., 0.),
aspect: 1.,
fovy: PI / 4.,
znear: 0.1,
zfar: 1000.,
});
},
);
let mut yaw = 0.0; let mut pitch = 0.0; scene.add_send_system(
move |camera: &mut WriteR<Camera, CustomEvents>, events: &mut ReadE<CustomEvents>| {
if let Some(camera) = camera.get_mut() {
let dt = events.dt();
let move_speed = dt * 3.;
let rotation_speed = dt * camera.fovy / PI;
let forward = camera.dir.normalized();
let right = forward.cross(&Vector3::unit_y()).normalized();
let up = Vector3::unit_y();
if events.is_pressed(KeyCode::KeyW) {
camera.eye += &forward * move_speed;
}
if events.is_pressed(KeyCode::KeyS) {
camera.eye -= &forward * move_speed;
}
if events.is_pressed(KeyCode::KeyA) {
camera.eye -= &right * move_speed;
}
if events.is_pressed(KeyCode::KeyD) {
camera.eye += &right * move_speed;
}
if events.is_pressed(KeyCode::Space) {
camera.eye += &up * move_speed;
}
if events.is_pressed(KeyCode::ControlLeft) {
camera.eye -= &up * move_speed;
}
if events.is_pressed(KeyCode::ArrowLeft) {
yaw -= rotation_speed; }
if events.is_pressed(KeyCode::ArrowRight) {
yaw += rotation_speed; }
if events.is_pressed(KeyCode::ArrowUp) {
pitch += rotation_speed; }
if events.is_pressed(KeyCode::ArrowDown) {
pitch -= rotation_speed; }
if events.is_just_pressed(KeyCode::KeyE) {
camera.fovy *= 2.0;
}
if events.is_just_pressed(KeyCode::KeyQ) {
camera.fovy /= 2.0;
}
let (sin_yaw, cos_yaw) = yaw.sin_cos();
let (sin_pitch, cos_pitch) = pitch.sin_cos();
let new_forward =
Vector3::new(cos_pitch * cos_yaw, sin_pitch, cos_pitch * sin_yaw);
camera.dir = new_forward.normalized();
}
},
);
}
}
fn main() {
let mut engine = <Engine>::new(EngineArgs::new(SingleThreaded, SingleThreaded));
engine.add_scene_plugin(WindowPlugin::new("hello example!"));
engine.add_scene_plugin(RendererPlugin);
engine.add_scene_plugin(Example1);
engine.run().unwrap();
}