iv/src/lib.rs
Steins7 a36c332ddd Partially fixed Framebuffer issues
* tweaked functions order in draw_triangle_frame()
2021-02-03 08:51:52 +01:00

224 lines
6.9 KiB
Rust

#[cfg(test)]
//--------------------------------------------------------------------------------------------------
/* imports */
#[allow(unused_imports)]
use log::{debug, error, info, trace, warn};
use gfx_backend_vulkan as vk_back;
pub mod io;
pub mod subengine;
use subengine::SubenginePipeline;
pub mod controller;
use controller::Controller;
pub mod utils;
//use utils::Rect;
mod renderer;
//use renderer::Renderer;
//mod controller;
//use controller::Controller;
//use crate::engine::{
// EngineController,
// TestEngine,
//};
pub enum Command {
NoCommand,
Stop,
Color{
r: f32,
g: f32,
b: f32,
a: f32,
},
}
pub enum Input {
Close,
Mouse{
x: f64,
y: f64,
},
}
//--------------------------------------------------------------------------------------------------
/* functions */
/// The main function of the library
pub fn run() -> Result<(), &'static str> {
use std::{
iter,
cell::RefCell,
};
use crate::{
io::WinitWindow,
renderer::Renderer,
utils::Rect,
subengine::{SubengineController, TestSubengine},
};
//creating windows
let window1 = RefCell::new(WinitWindow::new("IV", Rect {w: 1280, h: 720}).unwrap());
//let window2 = RefCell::new(WinitWindow::new("IV 2", Rect {w: 720, h: 480}).unwrap());
//creating renderers
let renderer1 = Renderer::<vk_back::Backend>::new(&mut iter::once(&window1)).unwrap();
//let renderer2 = Renderer::<vk_back::Backend>::new(&mut iter::once(&window2)).unwrap();
//creating subengines
let (test_subengine1, _test_rx1) = TestSubengine::new("run1");
let test_controller1 = SubengineController::new(test_subengine1);
//let (test_subengine2, _test_rx2) = TestSubengine::new("run2");
//let test_controller2 = SubengineController::new(test_subengine2);
//preparing data
let inputs = vec![&window1];
let subengines = vec![vec![test_controller1/*, test_controller2*/]];
let renderers = vec![(renderer1, &window1)/*, (renderer2, &window2)*/];
//creating pipeline
let subengine_pipeline = SubenginePipeline::new(inputs, subengines, renderers);
//running controller
let mut controller = Controller::new(vec![subengine_pipeline]);
loop {
//for _i in 0..40 {
controller.run();
}
//let engine_pipelines = vec![
// EnginePipeline {
// Inputs: vec![0,1],
// Engines: vec![&color_engine],
// Renderers: vec![(1,0)],
// },
// EnginePipeline {
// Inputs: vec![3],
// Engines: vec![&color_engine],
// Renderers: vec![(1,1),(1,2),(1,3)],
//}];
//let controller = Controller::new(renderers, &windows, &windows, engine_pipelines);
//controller.run();
//Ok(())
//let local_state = LocalState::default();
// let color = [0.5, 0.0, 0.0, 1.0];
//
// loop {
// for window in &mut windows {
// match renderer.draw_clear_frame(window, color) {
// Err(err) => println!("{}", err),
// _ => (),
// }}}
//
Ok(())
}
// let (input_tx, input_rx) = mpsc::channel();
// let mut window_senders = HashMap::with_capacity(1);
// window_senders.insert(1, input_tx);
//
// let control_thread = RefCell::new(Some(thread::spawn(move || {
// #[allow(unused_imports)]
// use log::{debug, error, info, trace, warn};
//
// let (cmd_tx, cmd_rx) = mpsc::channel();
// let render_thread = thread::spawn(move || {
// #[allow(unused_imports)]
// use log::{debug, error, info, trace, warn};
//
// let mut color = [0.0, 0.0, 0.0, 0.0];
//
// loop
//
// //TODO manage errors
// for window in windows {
// let _ = renderer.draw_clear_frame(&mut window, color);
// }
//
// match cmd_rx.try_recv().unwrap_or(Command::NoCommand) {
// Command::NoCommand => (),
// Command::Stop => {
// warn!("Stop render thread");
// return;
// },
// Command::Color{r, g, b, a} => {
// color = [r, g, b, a];
// },
// }
// }
// });
//
// loop {
// match input_rx.recv().unwrap() {
// Input::Close => {
// cmd_tx.send(Command::Stop).unwrap();
// //TODO stop event_loop
// warn!("wait for render thread");
// render_thread.join().unwrap();
// warn!("Stop control thread");
// return;
// },
// Input::Mouse{x, y} => {
// let pos = Command::Color{
// r: (x/1280.0) as f32,
// g: (y/720.0) as f32,
// b: ((x/1280.0 + y/720.0)/2.0) as f32,
// a: 1.0,
// };
// cmd_tx.send(pos).unwrap();
// },
// }
// }
// })));
//
// windows[0].event_loop.run(move |event, _, control_flow| {
// #[allow(unused_imports)]
// use log::{debug, error, info, trace, warn};
//
// *control_flow = ControlFlow::Wait;
//
// //TODO manage errors
// let input_tx = window_senders.get(&1).unwrap();
// match event {
// Event::WindowEvent{window_id: _, event} => match event {
// WindowEvent::CloseRequested => {
// input_tx.send(Input::Close).unwrap();
// let handle = control_thread.replace(None).unwrap();
// warn!("Wait for control thread");
// handle.join().unwrap();
// warn!("Stop input thread");
// *control_flow = ControlFlow::Exit;
// },
// WindowEvent::CursorMoved{position, ..} => {
// input_tx
// .send(Input::Mouse{
// x: position.x,
// y: position.y})
// .unwrap();
// },
// _ => (),
// }
// _ => (),
// }
// });
//}
//
//mod tests {
// #[test]
// fn it_works() {
// assert_eq!(2 + 2, 4);
// }
//}