use crate::model::Model; use crate::camera::Camera; use crate::camera::Camera_Movement; use crate::shader::shader; use std::sync::Arc; use std::rc::Rc; use glow::*; use imgui_glow_renderer::AutoRenderer; use imgui_sdl2_support::SdlPlatform; use crate::debug; pub mod objects; use cgmath::{Matrix4, vec3, Point3, Deg, perspective}; use cgmath::prelude::*; use sdl2::keyboard::Keycode; use sdl2::event::Event; const SCR_WIDTH: u32 = 1600; const SCR_HEIGHT: u32 = 900; const MODELS: [&str; 3]= ["resources/models/TestCarModel/CarW4.obj", "resources/models/TestCarModel/CarW1.obj", "resources/models/TestCarModel/CarW0.obj"]; use crate::debug::Debug; pub enum SceneEnum { Exit, Pause, Resume, } pub struct Scene { gl: Arc, pub Car: objects::Player, camera: Camera, debug: Debug, shaders: Vec>, time: std::time::Instant, DebugMode: bool, } impl Scene{ pub fn new(gl: Arc) -> Scene { let Car = objects::Player::new(Arc::clone(&gl)); let shader = Rc::new(shader::new("model", Arc::clone(&gl))); let time = std::time::Instant::now(); let camera = Camera { Position: Point3::new(0.0, 0.40, 1.0), Pitch: -20.0, ..Camera::default() }; let debug = Debug::new(gl.clone()); Scene{ gl, Car, camera, debug, shaders: vec![shader], time, DebugMode: false } } pub fn update(&mut self ,events_loop: &mut sdl2::EventPump, window: &sdl2::video::Window) -> SceneEnum { let mut ret = SceneEnum::Resume; unsafe { self.gl.enable(glow::DEPTH_TEST); self.gl.clear(glow::COLOR_BUFFER_BIT | glow::DEPTH_BUFFER_BIT); } /* unsafe { self.shaders[0].Use(); self.tempData.projection = perspective(Deg(self.camera.Zoom), SCR_WIDTH as f32 /SCR_HEIGHT as f32, 0.1, 100.0); let view = self.camera.GetViewMatrix(); self.shaders[0].setMat4("projection", &self.tempData.projection); self.shaders[0].setMat4("view", &view); let mut model: Matrix4 = Matrix4::from_axis_angle(vec3(0.0, -1.0, 0.0).normalize(), cgmath::Rad(1.0)); model = model * Matrix4::from_scale(0.2); self.shaders[0].setMat4("model", &model); } */ self.Car.update(); self.Car.Draw(&self.shaders[0], &self.camera); if self.DebugMode{ self.handleDebug(events_loop, window, &mut ret) } for event in events_loop.poll_iter() { if self.DebugMode { self.debug.handle(&event); } match event { Event::Quit {..} | Event::KeyDown { keycode: Some(Keycode::Escape), .. } => { ret = SceneEnum::Exit; }, Event::KeyDown {keycode: Some(Keycode::P), ..} => { }, Event::KeyDown {keycode: Some(Keycode::Q), ..} => { self.DebugMode = !self.DebugMode }, Event::KeyDown {keycode: Some(Keycode::W), ..} => { self.Car.forward(); }, Event::KeyDown {keycode: Some(Keycode::A), .. }=> { self.Car.turn(2.5); } Event::KeyDown {keycode: Some(Keycode::M), ..} => { self.debug.addWindow(debug::OpenWindows::ModelInfo) }, _ => {} } } ret } fn handleDebug(&mut self, events_loop:&mut sdl2::EventPump, window: &sdl2::video::Window, ret: &mut SceneEnum) { let mut Callbacks = Vec::new(); let windows = self.debug.windows.clone(); for (id, window) in windows { match window { debug::OpenWindows::ModelInfo => Callbacks.push(debug::ModelInfo(&self.Car.Model)), debug::OpenWindows::MainMenu => Callbacks.push(debug::Callback::MainMenu), debug::OpenWindows::Object(a) => Callbacks.push(debug::ObjectInfo(&self.Car)), } } for command in self.debug.drawImgui(&events_loop, &window, Callbacks) { use crate::debug::dEvent; match command { dEvent::exit => *ret = SceneEnum::Exit, dEvent::loadModel(i) => self.Car.Model = Model::new(MODELS[i as usize], Arc::clone(&self.gl)), dEvent::addWindow(a) => self.debug.addWindow(a), dEvent::removeWindow(a) => self.debug.removeWindow(a), dEvent::setObj(p) => { self.Car.Transform.Position = p; } // TODO dEvent::getObj(_a) => () } } } }