From c8dbfc726898b043d6a026d6668038cc65dfeb9e Mon Sep 17 00:00:00 2001
From: Quaternions <krakow20@gmail.com>
Date: Fri, 21 Jul 2023 00:53:28 -0700
Subject: [PATCH] mouse control

---
 src/main.rs | 21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index a7b18cf..450e5ca 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -7,7 +7,7 @@
 // notice may not be copied, modified, or distributed except
 // according to those terms.
 
-use cgmath::{Matrix3, Matrix4, Point3, Rad, Vector3, Transform,Rotation, Quaternion};
+use cgmath::{Matrix3, Matrix4, Rad, Vector2, Vector3, Rotation, Quaternion, Euler};
 use strafe_client::{Normal, Position, INDICES, NORMALS, POSITIONS};
 use std::{sync::Arc, time::Instant};
 use vulkano::{
@@ -50,7 +50,7 @@ use vulkano::{
 };
 use vulkano_win::VkSurfaceBuild;
 use winit::{
-	event::{ElementState,KeyboardInput,VirtualKeyCode,Event, WindowEvent},
+	event::{ElementState,KeyboardInput,VirtualKeyCode,Event, WindowEvent, DeviceEvent},
 	event_loop::{ControlFlow, EventLoop},
 	window::{Window, WindowBuilder},
 };
@@ -285,8 +285,8 @@ fn main() {
 
 	let mut time = Instant::now();
 	//polution
+	let mut mouse = Vector2::new(0.0,0.0);
 	let mut pos = Vector3::new(0.0,0.0,0.0);
-	let mut orientation = Quaternion::new(1.0,0.0,0.0,0.0);
 	let mut controls:u32 = 0;
 	let fly_speed = 0.05;
 	event_loop.run(move |event, _, control_flow| {
@@ -303,6 +303,15 @@ fn main() {
 			} => {
 				recreate_swapchain = true;
 			}
+			Event::DeviceEvent {
+				event:
+					DeviceEvent::MouseMotion {
+						delta,
+					},
+				..
+			} => {
+				mouse+=Vector2::from(delta);
+			}
 			Event::WindowEvent {
 				event:
 					WindowEvent::KeyboardInput {
@@ -348,8 +357,10 @@ fn main() {
 		}
 		let time_now = Instant::now();
 		let dt = (time_now-time).as_secs_f64();
-		if dt > 1.0 / 60.0 {
+		if dt > 1.0 / 120.0 {
 			time = time_now;
+				let angles = Euler{x:Rad(mouse.y/128.),y:Rad(mouse.x/128.),z:Rad(0.0)};
+				let orientation=Quaternion::from(angles);
 				pos += orientation.rotate_vector(get_control_dir(controls))*fly_speed;
 
 				let window = surface.object().unwrap().downcast_ref::<Window>().unwrap();
@@ -400,7 +411,7 @@ fn main() {
 						0.01,
 						100.0,
 					);
-					let view = Matrix4::from_translation(pos)+Matrix4::from(orientation);
+					let view = Matrix4::from_translation(pos)*Matrix4::from(angles);
 					let scale = Matrix4::from_scale(-0.01);
 
 					let uniform_data = vs::Data {