From b52193df28a3402381e35386d0bab993c7f06b0c Mon Sep 17 00:00:00 2001 From: Piotrek Date: Thu, 15 Apr 2021 08:55:26 +0200 Subject: [PATCH] working generating camera rays from view and proj matrices --- build.rs | 11 ++++++++--- src/app.rs | 8 ++++---- src/camera.rs | 27 +++++++++++++++++---------- src/camera_controller.rs | 5 ++++- src/shaders/bin/shader.frag.spv | Bin 8168 -> 8768 bytes src/shaders/bin/shader.vert.spv | Bin 1500 -> 1080 bytes src/shaders/raymarching.cginc | 4 ++-- src/shaders/shader.frag | 17 ++++++++++++----- src/shaders/shader.vert | 8 -------- src/uniforms.rs | 15 ++++----------- 10 files changed, 51 insertions(+), 44 deletions(-) diff --git a/build.rs b/build.rs index a1c065d..156b048 100644 --- a/build.rs +++ b/build.rs @@ -58,9 +58,14 @@ fn main() { let mut compiler = shaderc::Compiler::new().expect("Unable to create shader compiler"); for shader in shaders { println!("cargo:rerun-if-changed={}", shader.src_path.as_os_str().to_str().unwrap()); - let compiled = compiler.compile_into_spirv(&shader.source, shader.kind, &shader.src_path.to_str().unwrap(), "main", Some(&options)) - .expect("Shader error:"); - write(shader.spv_path, compiled.as_binary_u8()).unwrap(); + + let result = compiler.compile_into_spirv(&shader.source, shader.kind, &shader.src_path.to_str().unwrap(), "main", Some(&options)); + match result { + Err(err) => { panic!("Failed: {}", err); }, + Ok(data) => { + write(shader.spv_path, data.as_binary_u8()).unwrap(); + } + } } // Rebuild if any of the cginc change diff --git a/src/app.rs b/src/app.rs index 56914a4..dad7791 100644 --- a/src/app.rs +++ b/src/app.rs @@ -13,10 +13,10 @@ use crate::camera_controller::CameraController; // A B // C D const VERTICES: &[Vertex] = &[ - Vertex { position: [-1.0, 1.0, 0.0], uv: [0.0, 0.0] }, // A - Vertex { position: [ 1.0, 1.0, 0.0], uv: [1.0, 0.0] }, // B - Vertex { position: [ 1.0,-1.0, 0.0], uv: [1.0, 1.0] }, // C - Vertex { position: [-1.0,-1.0, 0.0], uv: [0.0, 1.0] }, // D + Vertex { position: [-1.0, 1.0, 0.0], uv: [-1.0, 1.0] }, // A + Vertex { position: [ 1.0, 1.0, 0.0], uv: [1.0, 1.0] }, // B + Vertex { position: [ 1.0,-1.0, 0.0], uv: [1.0, -1.0] }, // C + Vertex { position: [-1.0,-1.0, 0.0], uv: [-1.0, -1.0] }, // D ]; const INDICES: &[u16] = &[ diff --git a/src/camera.rs b/src/camera.rs index 61b855f..bd95ffd 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -1,12 +1,12 @@ use cgmath::{Point3, Vector3, Matrix4, Deg}; -#[rustfmt::skip] -const OPENGL_TO_WGPU_MATRIX: cgmath::Matrix4 = cgmath::Matrix4::new( - 1.0, 0.0, 0.0, 0.0, - 0.0, 1.0, 0.0, 0.0, - 0.0, 0.0, 0.5, 0.0, - 0.0, 0.0, 0.5, 1.0, -); +// #[rustfmt::skip] +// const OPENGL_TO_WGPU_MATRIX: cgmath::Matrix4 = cgmath::Matrix4::new( +// 1.0, 0.0, 0.0, 0.0, +// 0.0, 1.0, 0.0, 0.0, +// 0.0, 0.0, 0.5, 0.0, +// 0.0, 0.0, 0.5, 1.0, +// ); pub struct Camera { pub position: Point3, @@ -22,7 +22,7 @@ impl Camera { pub fn new(aspect: f32, fov: f32) -> Self { Self { - position: (0.0, 0.0, 0.0).into(), + position: (0.0, 1.0, 0.0).into(), forward: (0.0, 0.0, 1.0).into(), up: Vector3::unit_y(), aspect, @@ -37,10 +37,17 @@ impl Camera { } pub fn proj_matrix(&self) -> Matrix4 { - return OPENGL_TO_WGPU_MATRIX * cgmath::perspective(Deg(self.fovy), self.aspect, self.znear, self.zfar); + return cgmath::perspective(Deg(self.fovy), self.aspect, self.znear, self.zfar); } pub fn view_matrix(&self) -> Matrix4 { - return OPENGL_TO_WGPU_MATRIX * Matrix4::look_to_rh(self.position, self.forward, self.up); + return Matrix4::look_to_rh((0.0,0.0,0.0).into(), self.forward, self.up); } + + // pub fn view_projection_matrix(&self) -> Matrix4 { + // let view = Matrix4::look_to_rh(self.position, self.forward, self.up); + // let proj = cgmath::perspective(Deg(self.fovy), self.aspect, self.znear, self.zfar); + // return proj; + // //return proj * view; + // } } diff --git a/src/camera_controller.rs b/src/camera_controller.rs index a180a92..36d6e11 100644 --- a/src/camera_controller.rs +++ b/src/camera_controller.rs @@ -11,6 +11,7 @@ struct CameraMovement { pub back: bool, pub left: bool, pub right: bool, + pub shift: bool, pub speed: f32, } @@ -59,6 +60,7 @@ impl CameraController { VirtualKeyCode::A | VirtualKeyCode::Left => { self.movement.left = is_pressed; true } VirtualKeyCode::S | VirtualKeyCode::Down => { self.movement.back = is_pressed; true } VirtualKeyCode::D | VirtualKeyCode::Right => { self.movement.right = is_pressed; true } + VirtualKeyCode::LShift => { self.movement.shift = is_pressed; true } _ => false, } } @@ -94,7 +96,8 @@ impl CameraController { camera.up = yaw_rot.transform_vector(pitch_rot.transform_vector(Vector3::unit_y())); // Movement amount - let amount = delta_time * self.movement.speed; + let mut amount = delta_time * self.movement.speed; + if self.movement.shift { amount *= 2.0; } // Forward and backwards if self.movement.fwd && camera.forward.magnitude() > amount { camera.position += camera.forward.normalize() * amount; } diff --git a/src/shaders/bin/shader.frag.spv b/src/shaders/bin/shader.frag.spv index 97ef2c570f6a138a62458186647db694248fecce..a2508ceb2f7fd24038724d2f367529d992caf39f 100644 GIT binary patch delta 2693 zcmY+G%~P9I6vppM5-?V(9Tx?iVky>IQa=zsij=R~3bhnMDQ&3L*9d6|ZAc7BN^$Y( zIIf)0Ve${uWmiro?sYG${TJ-gmDYv&{BG_g=_M!kJkL4zoO|xM?;HM@`1M?OtYe_d zn7}-3y3Ln6-P4Jsz?ij%%fAIj(#Dulwwx_!PMDZk)Vw;39ygiBRL2iNbW+YM#XH5a zbxD|u!nJ(vZn&C2)xE?n7Fuzfg ztr@37wv}ulEEPA!#3GY+f!Gr}ujR^>uv(KbZf*#dv-j*?*vOi2v04dR8;+ZGajhET zX5$GQGk1k6xh)%SyQznpg_4<3{J9{a2C6h7nmYs!@TJkt>5$EHmSZ6&{^U9^>n0_B z9b9W&>jd!oN-`a(D+J?MrnMtZlyfi`Rh&S>OAUr))EgnG?P!nRPbrw`Bb$_x-LqKX{~(>AVpneU!oaUf1F1 zP37L(-5vAnkT9{~Z)x_iPYY{Icsyd)&F-&zUl^ab1e^DplD@Y)JMQD36(&Bsd?RyM zMa~LPXk5~x?@PjP;68T);1D`@RF-+^G>ArxI!vSBurD~BHQ+0n^|7}FfACVEtw7>% zOG->SiE#kaNjR!m)0`Lf32r-`4fUF&sn!$8fw7ucMpZLW!1SB(g4S+HC)+*8f$;-x z*K^5K#KTTZ*rzn}ytQMVt#-__1)kDDQS@aA2l1V_F~#5j799`fak(nYtzFO>4*r^S zIE`qZ%s3K0trQ&0vIJ*rv@s>wQ4nm`B_zUUUR!5VA3Gi!gNXwi*RfJ4cE9mYq^EiK zZ_B~&{8Nz_zyu7Xv(WGSGwE;)&t)A4?YYk#M{-}xia6HekDY>cB3I3-2$JLUj1Gwk za}s^bc?ou3tBUsS>IoJvH0A-u6Dogf(LHF(6m2};sW zC>d+8`D(wAj*a2Dvg4pVx9PaHQ|U7mkpy4?4)mDhJPega_kkBX`uPo`8{E-Dn)wa$ zm^+)PU+DfRnwR#Gg!dHzSOquYZry_P0}}YOIBw=;2|VvM)?9F$KaDHGJ(6$aPsVE! zINo*mXB?*-gZ64Kiy#RGpX9o9cwUMuTCD$guox^h4n6yOGB{a()bmR)(|FJu#-f*0 zvp#xs^(KyGXt4@rM44u5R;_)Nn#)7xT(B|g(T(&6Yk znckDmAQQHCC8H9eq5Dky?vM$8Z20(0XUG(di8&+jnZ~8V(R?yZN@tJ>+k^y;Xy`uE zS?Of*Hs(W2;r?glPeHf>xcE4u_vl2+KJ)dtYn+>FDt O5&TGT{xg9&E%_fPvi!jS delta 2087 zcmY+F&2vm?6vof(4~Y;TWkE1>1R)(C!5}i7PWwuQppzgHp(m3xL#S4nL|IJLH8o{R zsa~1Y_zToj&t5F7Bx`Fs{sLlw=Xd*krQPaN?{l7W&ikDAo_lZ4oqV5djK^B)%mQn$ zM!WO0u{Svon2r56@+SD{f|=bLpB}%fHED4h)H-<(oUq|aF7_k{+mt*}x>K5VDgE-N zOV#uX;K^z_o8B)@&lG0wt2}9A@=LQbg{9hrT@$w?m$1SQe%yYSKT~`V$xl`BXyK2$ z_pDd_Ah1PEaN#3R>r=d~8jj-l%{4w7*2bqQ3&}!|Z?|Qp+hgZsXJ!3vO-o{#@I~1_ z&z@y{-X)g=z?HL@<}GYhzOjS7B94vk>GiA%z-QxCK2RWmBg%}mHr){?NRBI0rguqi$Rg=@0q zcB7nYXvy3Z!*#=D;WJjQjTW<8!nAnXaro?pKUIF-kPdlTnJ#R-R-V{epC_``=ZVDc zRwvYQLo%x6kb}Y;{BL*Yi^6amen1=tyetgQB`%D}VMoH}#UOA+4#~v0Q!5=mBCMaC zayc|Y)9^Gx?R8Vo~weEt^2kxz^quXHF<`dQ2&nO8b2499m0rK7@JC=oj%`$fiXV6Vgn6D9JAk>iyz zD23f(GBU4}6^3K@DCLB?P$JeNgJU?0D$_yjnK`>AGaHTKWE5N))hYRm nfMu`~1 z#n@}5n&&UK`C6M~Itjd0xM4>dze@59Q9y-v12~?{AsUfu1|5eO<=*ea>bu4j@EzAB zKFyT(iObg~vR=|YeVUuTzh{vI8TUkHl=dT1-od>%ok-E;Y+D jgF4eK$}UkL8vJRMO3U!WxXG;AtEKY2l&iIM4D9