2023-03-16 16:01:57 +01:00
|
|
|
|
|
|
|
use crate::model::Model;
|
|
|
|
use crate::camera::Camera;
|
2023-03-27 15:34:00 +02:00
|
|
|
use crate::camera::Camera_Movement;
|
2023-03-16 16:01:57 +01:00
|
|
|
use crate::shader::shader;
|
|
|
|
use std::sync::Arc;
|
|
|
|
use std::rc::Rc;
|
2023-03-20 16:31:42 +01:00
|
|
|
use glow::*;
|
2023-03-16 16:01:57 +01:00
|
|
|
|
|
|
|
use imgui_glow_renderer::AutoRenderer;
|
|
|
|
use imgui_sdl2_support::SdlPlatform;
|
2023-03-23 12:17:21 +01:00
|
|
|
use crate::debug;
|
2023-03-30 10:46:33 +02:00
|
|
|
pub mod objects;
|
2023-03-16 16:01:57 +01:00
|
|
|
use cgmath::{Matrix4, vec3, Point3, Deg, perspective};
|
|
|
|
use cgmath::prelude::*;
|
|
|
|
|
2023-03-20 16:31:42 +01:00
|
|
|
use sdl2::keyboard::Keycode;
|
|
|
|
use sdl2::event::Event;
|
|
|
|
|
|
|
|
const SCR_WIDTH: u32 = 1600;
|
|
|
|
const SCR_HEIGHT: u32 = 900;
|
|
|
|
|
2023-03-16 16:01:57 +01:00
|
|
|
const MODELS: [&str; 3]= ["resources/models/TestCarModel/CarW4.obj", "resources/models/TestCarModel/CarW1.obj",
|
|
|
|
"resources/models/TestCarModel/CarW0.obj"];
|
|
|
|
|
2023-03-21 14:14:15 +01:00
|
|
|
use crate::debug::Debug;
|
2023-03-16 16:01:57 +01:00
|
|
|
|
2023-03-20 19:09:35 +01:00
|
|
|
pub enum SceneEnum {
|
|
|
|
Exit,
|
|
|
|
Pause,
|
|
|
|
Resume,
|
|
|
|
}
|
2023-03-16 16:01:57 +01:00
|
|
|
|
|
|
|
|
2023-03-20 16:31:42 +01:00
|
|
|
pub struct Scene {
|
2023-03-16 16:01:57 +01:00
|
|
|
gl: Arc<glow::Context>,
|
2023-03-27 15:34:00 +02:00
|
|
|
pub Car: objects::Player,
|
2023-03-16 16:01:57 +01:00
|
|
|
camera: Camera,
|
2023-03-21 14:14:15 +01:00
|
|
|
debug: Debug,
|
2023-03-16 16:01:57 +01:00
|
|
|
shaders: Vec<Rc<shader>>,
|
|
|
|
time: std::time::Instant,
|
2023-03-30 16:57:35 +02:00
|
|
|
DebugMode: bool,
|
2023-03-16 16:01:57 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
impl Scene{
|
2023-03-20 16:31:42 +01:00
|
|
|
pub fn new(gl: Arc<glow::Context>) -> Scene
|
2023-03-16 16:01:57 +01:00
|
|
|
{
|
2023-03-27 15:34:00 +02:00
|
|
|
let Car = objects::Player::new(Arc::clone(&gl));
|
2023-03-16 16:01:57 +01:00
|
|
|
|
|
|
|
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()
|
|
|
|
};
|
|
|
|
|
2023-03-21 14:14:15 +01:00
|
|
|
let debug = Debug::new(gl.clone());
|
2023-03-16 16:01:57 +01:00
|
|
|
Scene{
|
|
|
|
gl,
|
|
|
|
Car,
|
|
|
|
camera,
|
2023-03-21 14:14:15 +01:00
|
|
|
debug,
|
2023-03-16 16:01:57 +01:00
|
|
|
shaders: vec![shader],
|
|
|
|
time,
|
2023-03-30 16:57:35 +02:00
|
|
|
DebugMode: false
|
2023-03-16 16:01:57 +01:00
|
|
|
}
|
2023-03-20 16:31:42 +01:00
|
|
|
}
|
|
|
|
|
2023-03-20 19:09:35 +01:00
|
|
|
pub fn update(&mut self ,events_loop: &mut sdl2::EventPump, window: &sdl2::video::Window) -> SceneEnum
|
2023-03-20 16:31:42 +01:00
|
|
|
{
|
2023-03-21 15:14:10 +01:00
|
|
|
let mut ret = SceneEnum::Resume;
|
2023-03-30 16:57:35 +02:00
|
|
|
|
2023-03-20 16:31:42 +01:00
|
|
|
unsafe {
|
2023-03-27 15:34:00 +02:00
|
|
|
self.gl.enable(glow::DEPTH_TEST);
|
|
|
|
self.gl.clear(glow::COLOR_BUFFER_BIT | glow::DEPTH_BUFFER_BIT);
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
unsafe {
|
2023-03-20 16:31:42 +01:00
|
|
|
|
|
|
|
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<f32> = Matrix4::from_axis_angle(vec3(0.0, -1.0, 0.0).normalize(),
|
2023-03-27 15:34:00 +02:00
|
|
|
cgmath::Rad(1.0));
|
2023-03-20 16:31:42 +01:00
|
|
|
|
|
|
|
model = model * Matrix4::from_scale(0.2);
|
|
|
|
self.shaders[0].setMat4("model", &model);
|
|
|
|
}
|
2023-03-27 15:34:00 +02:00
|
|
|
*/
|
|
|
|
self.Car.update();
|
|
|
|
self.Car.Draw(&self.shaders[0], &self.camera);
|
|
|
|
|
2023-03-16 16:01:57 +01:00
|
|
|
|
2023-03-30 16:57:35 +02:00
|
|
|
if self.DebugMode{
|
2023-03-24 10:41:27 +01:00
|
|
|
self.handleDebug(events_loop, window, &mut ret)
|
|
|
|
}
|
2023-03-16 16:01:57 +01:00
|
|
|
|
2023-03-20 16:31:42 +01:00
|
|
|
for event in events_loop.poll_iter() {
|
2023-03-30 16:57:35 +02:00
|
|
|
if self.DebugMode {
|
2023-03-21 14:14:15 +01:00
|
|
|
self.debug.handle(&event);
|
2023-03-20 19:09:35 +01:00
|
|
|
}
|
|
|
|
match event {
|
|
|
|
Event::Quit {..} |
|
|
|
|
Event::KeyDown { keycode: Some(Keycode::Escape), .. } => {
|
|
|
|
ret = SceneEnum::Exit;
|
|
|
|
},
|
|
|
|
Event::KeyDown {keycode: Some(Keycode::P), ..} => {
|
|
|
|
},
|
2023-03-30 15:57:25 +02:00
|
|
|
Event::KeyDown {keycode: Some(Keycode::Q), ..} => {
|
2023-03-30 16:57:35 +02:00
|
|
|
self.DebugMode = !self.DebugMode
|
2023-03-30 15:57:25 +02:00
|
|
|
},
|
|
|
|
Event::KeyDown {keycode: Some(Keycode::W), ..} => {
|
|
|
|
self.Car.forward();
|
|
|
|
},
|
|
|
|
Event::KeyDown {keycode: Some(Keycode::A), .. }=> {
|
|
|
|
self.Car.turn(2.5);
|
2023-03-23 16:21:05 +01:00
|
|
|
}
|
|
|
|
Event::KeyDown {keycode: Some(Keycode::M), ..} => {
|
|
|
|
self.debug.addWindow(debug::OpenWindows::ModelInfo)
|
2023-03-27 15:34:00 +02:00
|
|
|
},
|
2023-03-20 19:09:35 +01:00
|
|
|
_ => {}
|
|
|
|
}
|
2023-03-16 16:01:57 +01:00
|
|
|
|
2023-03-20 16:31:42 +01:00
|
|
|
}
|
2023-03-20 19:09:35 +01:00
|
|
|
|
|
|
|
ret
|
2023-03-20 16:31:42 +01:00
|
|
|
}
|
2023-03-16 16:01:57 +01:00
|
|
|
|
2023-03-24 10:41:27 +01:00
|
|
|
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 {
|
2023-03-27 15:34:00 +02:00
|
|
|
debug::OpenWindows::ModelInfo => Callbacks.push(debug::ModelInfo(&self.Car.Model)),
|
2023-03-24 10:41:27 +01:00
|
|
|
debug::OpenWindows::MainMenu => Callbacks.push(debug::Callback::MainMenu),
|
2023-03-30 10:46:33 +02:00
|
|
|
debug::OpenWindows::Object(a) => Callbacks.push(debug::ObjectInfo(&self.Car)),
|
2023-03-24 10:41:27 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for command in self.debug.drawImgui(&events_loop, &window, Callbacks)
|
|
|
|
{
|
|
|
|
use crate::debug::dEvent;
|
|
|
|
match command
|
|
|
|
{
|
|
|
|
dEvent::exit => *ret = SceneEnum::Exit,
|
2023-03-27 15:34:00 +02:00
|
|
|
dEvent::loadModel(i) => self.Car.Model = Model::new(MODELS[i as usize], Arc::clone(&self.gl)),
|
2023-03-24 10:41:27 +01:00
|
|
|
dEvent::addWindow(a) => self.debug.addWindow(a),
|
|
|
|
dEvent::removeWindow(a) => self.debug.removeWindow(a),
|
2023-03-30 15:57:25 +02:00
|
|
|
dEvent::setObj(p) =>
|
2023-03-30 10:46:33 +02:00
|
|
|
{
|
|
|
|
self.Car.Transform.Position = p;
|
|
|
|
}
|
|
|
|
// TODO
|
|
|
|
dEvent::getObj(_a) => ()
|
2023-03-24 10:41:27 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2023-03-16 16:01:57 +01:00
|
|
|
|
|
|
|
}
|