[CAMERA] Fix no updated
This commit is contained in:
parent
67cd53b91e
commit
ca26586047
1 changed files with 27 additions and 39 deletions
|
@ -13,16 +13,26 @@ pub const OPENGL_TO_WGPU_MATRIX: cgmath::Matrix4<f32> = cgmath::Matrix4::new(
|
||||||
0.0, 0.0, 0.5, 1.0,
|
0.0, 0.0, 0.5, 1.0,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// We need this for Rust to store our data correctly for the shaders
|
||||||
|
#[repr(C)]
|
||||||
|
// This is so we can store this in a buffer
|
||||||
|
#[derive(Debug, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable, Default)]
|
||||||
|
struct CameraUniform {
|
||||||
|
// We can't use cgmath with bytemuck directly so we'll have
|
||||||
|
// to convert the Matrix4 into a 4x4 f32 array
|
||||||
|
view_proj: [[f32; 4]; 4],
|
||||||
|
}
|
||||||
|
|
||||||
pub struct Camera {
|
pub struct Camera {
|
||||||
pub eye: cgmath::Point3<f32>,
|
eye: cgmath::Point3<f32>,
|
||||||
pub target: cgmath::Point3<f32>,
|
target: cgmath::Point3<f32>,
|
||||||
pub up: cgmath::Vector3<f32>,
|
up: cgmath::Vector3<f32>,
|
||||||
pub aspect: f32,
|
aspect: f32,
|
||||||
pub fovy: f32,
|
fovy: f32,
|
||||||
pub znear: f32,
|
znear: f32,
|
||||||
pub zfar: f32,
|
zfar: f32,
|
||||||
controller: CameraController,
|
controller: CameraController,
|
||||||
uniform: Option<CameraUniform>,
|
uniform: CameraUniform,
|
||||||
bind_group: Option<wgpu::BindGroup>,
|
bind_group: Option<wgpu::BindGroup>,
|
||||||
bind_group_layout: Option<wgpu::BindGroupLayout>,
|
bind_group_layout: Option<wgpu::BindGroupLayout>,
|
||||||
buffer: Option<wgpu::Buffer>,
|
buffer: Option<wgpu::Buffer>,
|
||||||
|
@ -41,23 +51,23 @@ impl Camera {
|
||||||
controller: CameraController::new(speed),
|
controller: CameraController::new(speed),
|
||||||
bind_group: None,
|
bind_group: None,
|
||||||
bind_group_layout: None,
|
bind_group_layout: None,
|
||||||
uniform: None,
|
uniform: CameraUniform::default(),
|
||||||
buffer: None,
|
buffer: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn build_view_projection_matrix(&self) -> cgmath::Matrix4<f32> {
|
fn update_uniform(&mut self) {
|
||||||
let view = cgmath::Matrix4::look_at_rh(self.eye, self.target, self.up);
|
let view = cgmath::Matrix4::look_at_rh(self.eye, self.target, self.up);
|
||||||
let proj = cgmath::perspective(cgmath::Deg(self.fovy), self.aspect, self.znear, self.zfar);
|
let proj = cgmath::perspective(cgmath::Deg(self.fovy), self.aspect, self.znear, self.zfar);
|
||||||
|
|
||||||
return OPENGL_TO_WGPU_MATRIX * proj * view;
|
self.uniform.view_proj = (OPENGL_TO_WGPU_MATRIX * proj * view).into();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_bind_group_layout(&self) -> &wgpu::BindGroupLayout {
|
pub fn get_bind_group_layout(&self) -> &wgpu::BindGroupLayout {
|
||||||
&self.bind_group_layout.as_ref().unwrap()
|
&self.bind_group_layout.as_ref().unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update_camera(&mut self) {
|
fn update_camera(&mut self) {
|
||||||
use cgmath::InnerSpace;
|
use cgmath::InnerSpace;
|
||||||
let forward = self.target - self.eye;
|
let forward = self.target - self.eye;
|
||||||
let forward_norm = forward.normalize();
|
let forward_norm = forward.normalize();
|
||||||
|
@ -86,12 +96,12 @@ impl Camera {
|
||||||
|
|
||||||
impl Renderable for Camera {
|
impl Renderable for Camera {
|
||||||
fn prepare(&mut self, device: &wgpu::Device) {
|
fn prepare(&mut self, device: &wgpu::Device) {
|
||||||
self.uniform = Some(CameraUniform::from(self));
|
self.update_uniform();
|
||||||
|
|
||||||
self.buffer = Some(
|
self.buffer = Some(
|
||||||
device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
|
device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
|
||||||
label: Some("Camera Buffer"),
|
label: Some("Camera Buffer"),
|
||||||
contents: bytemuck::cast_slice(&[self.uniform.unwrap()]),
|
contents: bytemuck::cast_slice(&[self.uniform]),
|
||||||
usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST,
|
usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST,
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
@ -124,11 +134,11 @@ impl Renderable for Camera {
|
||||||
|
|
||||||
fn update_instances(&mut self, queue: &wgpu::Queue) {
|
fn update_instances(&mut self, queue: &wgpu::Queue) {
|
||||||
self.update_camera();
|
self.update_camera();
|
||||||
self.uniform.unwrap().update_view_proj(self);
|
self.update_uniform();
|
||||||
queue.write_buffer(
|
queue.write_buffer(
|
||||||
&self.buffer.as_ref().unwrap(),
|
&self.buffer.as_ref().unwrap(),
|
||||||
0,
|
0,
|
||||||
bytemuck::cast_slice(&[self.uniform.unwrap()]),
|
bytemuck::cast_slice(&[self.uniform]),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,26 +207,4 @@ impl CameraController {
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We need this for Rust to store our data correctly for the shaders
|
|
||||||
#[repr(C)]
|
|
||||||
// This is so we can store this in a buffer
|
|
||||||
#[derive(Debug, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)]
|
|
||||||
struct CameraUniform {
|
|
||||||
// We can't use cgmath with bytemuck directly so we'll have
|
|
||||||
// to convert the Matrix4 into a 4x4 f32 array
|
|
||||||
view_proj: [[f32; 4]; 4],
|
|
||||||
}
|
|
||||||
|
|
||||||
impl CameraUniform {
|
|
||||||
pub fn from(camera: &Camera) -> Self {
|
|
||||||
Self {
|
|
||||||
view_proj: camera.build_view_projection_matrix().into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn update_view_proj(&mut self, camera: &Camera) {
|
|
||||||
self.view_proj = camera.build_view_projection_matrix().into();
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue