|
@@ -3,7 +3,7 @@ use std::iter;
|
|
|
use wgpu::util::DeviceExt;
|
|
use wgpu::util::DeviceExt;
|
|
|
use winit::{event::WindowEvent, window::Window};
|
|
use winit::{event::WindowEvent, window::Window};
|
|
|
|
|
|
|
|
-use crate::{vertex::Vertex, vertex_buffer::{VERT2, VERT3, VERTICES}};
|
|
|
|
|
|
|
+use crate::{camera::{self, Camera}, camera_controller, camera_uniform, vertex::Vertex, vertex_buffer::{VERT2, VERT3, VERTICES}};
|
|
|
|
|
|
|
|
|
|
|
|
|
pub struct State<'a> {
|
|
pub struct State<'a> {
|
|
@@ -19,6 +19,11 @@ pub struct State<'a> {
|
|
|
render_pipeline: wgpu::RenderPipeline,
|
|
render_pipeline: wgpu::RenderPipeline,
|
|
|
vertex_buffer: wgpu::Buffer,
|
|
vertex_buffer: wgpu::Buffer,
|
|
|
num_vertices: u32,
|
|
num_vertices: u32,
|
|
|
|
|
+ camera: camera::Camera,
|
|
|
|
|
+ camera_buffer: wgpu::Buffer,
|
|
|
|
|
+ camera_uniform: camera_uniform::CameraUniform,
|
|
|
|
|
+ camera_bind_group: wgpu::BindGroup,
|
|
|
|
|
+ camera_controller: camera_controller::CameraController,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
impl<'a> State<'a> {
|
|
impl<'a> State<'a> {
|
|
@@ -85,6 +90,75 @@ impl<'a> State<'a> {
|
|
|
surface.configure(&device, &config);
|
|
surface.configure(&device, &config);
|
|
|
//All the above is just for the surface
|
|
//All the above is just for the surface
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+ let vert = VERT3;
|
|
|
|
|
+ let num_vertices = vert.len() as u32;
|
|
|
|
|
+ //Now the vertex buffer
|
|
|
|
|
+ let vertex_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor{
|
|
|
|
|
+ label: Some("Vertex Buffer"),
|
|
|
|
|
+ usage: wgpu::BufferUsages::VERTEX,
|
|
|
|
|
+ contents: bytemuck::cast_slice(vert)
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ //Camera creation
|
|
|
|
|
+ let camera = Camera{
|
|
|
|
|
+ eye: glam::Vec3::new(0.0, 0.0, 1.0),
|
|
|
|
|
+ target: glam::Vec3::ZERO,
|
|
|
|
|
+ up: glam::Vec3::Y,
|
|
|
|
|
+ aspect: config.width as f32 / config.height as f32,
|
|
|
|
|
+ fovy: 30.0,
|
|
|
|
|
+ znear: 0.1,
|
|
|
|
|
+ zfar: 100.0,
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ //CameraUniform creation
|
|
|
|
|
+ let mut camera_uniform = camera_uniform::CameraUniform::new();
|
|
|
|
|
+ camera_uniform.update_view_proj(&camera);
|
|
|
|
|
+
|
|
|
|
|
+ //Camera Buffer
|
|
|
|
|
+ let camera_buffer = device.create_buffer_init(
|
|
|
|
|
+ &wgpu::util::BufferInitDescriptor{
|
|
|
|
|
+ label: Some("Camera Buffer"),
|
|
|
|
|
+ contents: bytemuck::cast_slice(&[camera_uniform]),
|
|
|
|
|
+ usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST
|
|
|
|
|
+ }
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ //Camera Bind Group Layout
|
|
|
|
|
+
|
|
|
|
|
+ let camera_bind_group_layout = device.create_bind_group_layout(
|
|
|
|
|
+ &wgpu::BindGroupLayoutDescriptor {
|
|
|
|
|
+ entries: &[
|
|
|
|
|
+ wgpu::BindGroupLayoutEntry{
|
|
|
|
|
+ binding: 0,
|
|
|
|
|
+ visibility: wgpu::ShaderStages::VERTEX,
|
|
|
|
|
+ ty: wgpu::BindingType::Buffer {
|
|
|
|
|
+ ty: wgpu::BufferBindingType::Uniform,
|
|
|
|
|
+ has_dynamic_offset: false,
|
|
|
|
|
+ min_binding_size: None
|
|
|
|
|
+ },
|
|
|
|
|
+ count: None
|
|
|
|
|
+ }
|
|
|
|
|
+ ],
|
|
|
|
|
+ label: Some("Camera Bind Group Layout")
|
|
|
|
|
+ }
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ //Camera Bind Group
|
|
|
|
|
+ let camera_bind_group = device.create_bind_group(
|
|
|
|
|
+ &wgpu::BindGroupDescriptor {
|
|
|
|
|
+ layout: &camera_bind_group_layout,
|
|
|
|
|
+ entries: &[
|
|
|
|
|
+ wgpu::BindGroupEntry{
|
|
|
|
|
+ binding: 0,
|
|
|
|
|
+ resource: camera_buffer.as_entire_binding(),
|
|
|
|
|
+ }
|
|
|
|
|
+ ],
|
|
|
|
|
+ label: Some("Camera Bind Group")
|
|
|
|
|
+ }
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
//Next is pipeline/shaders
|
|
//Next is pipeline/shaders
|
|
|
|
|
|
|
|
let shader_module = device.create_shader_module(wgpu::ShaderModuleDescriptor{
|
|
let shader_module = device.create_shader_module(wgpu::ShaderModuleDescriptor{
|
|
@@ -94,7 +168,9 @@ impl<'a> State<'a> {
|
|
|
|
|
|
|
|
let render_pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor{
|
|
let render_pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor{
|
|
|
label: Some("Render Pipeline Layout"),
|
|
label: Some("Render Pipeline Layout"),
|
|
|
- bind_group_layouts: &[],
|
|
|
|
|
|
|
+ bind_group_layouts: &[
|
|
|
|
|
+ &camera_bind_group_layout
|
|
|
|
|
+ ],
|
|
|
push_constant_ranges: &[]
|
|
push_constant_ranges: &[]
|
|
|
});
|
|
});
|
|
|
|
|
|
|
@@ -144,15 +220,8 @@ impl<'a> State<'a> {
|
|
|
multiview: None,
|
|
multiview: None,
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
-
|
|
|
|
|
- let vert = VERT3;
|
|
|
|
|
- let num_vertices = vert.len() as u32;
|
|
|
|
|
- //Now the vertex buffer
|
|
|
|
|
- let vertex_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor{
|
|
|
|
|
- label: Some("Vertex Buffer"),
|
|
|
|
|
- usage: wgpu::BufferUsages::VERTEX,
|
|
|
|
|
- contents: bytemuck::cast_slice(vert)
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ //Camera controller
|
|
|
|
|
+ let camera_controller = camera_controller::CameraController::new(0.2);
|
|
|
|
|
|
|
|
Self {
|
|
Self {
|
|
|
surface,
|
|
surface,
|
|
@@ -164,6 +233,11 @@ impl<'a> State<'a> {
|
|
|
render_pipeline,
|
|
render_pipeline,
|
|
|
vertex_buffer,
|
|
vertex_buffer,
|
|
|
num_vertices,
|
|
num_vertices,
|
|
|
|
|
+ camera,
|
|
|
|
|
+ camera_buffer,
|
|
|
|
|
+ camera_uniform,
|
|
|
|
|
+ camera_bind_group,
|
|
|
|
|
+ camera_controller
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -180,12 +254,16 @@ impl<'a> State<'a> {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- #[allow(unused_variables)]
|
|
|
|
|
pub fn input(&mut self, event: &WindowEvent) -> bool {
|
|
pub fn input(&mut self, event: &WindowEvent) -> bool {
|
|
|
- false
|
|
|
|
|
|
|
+ println!("{:?}", event);
|
|
|
|
|
+ self.camera_controller.process_events(event)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- pub fn update(&mut self) {}
|
|
|
|
|
|
|
+ pub fn update(&mut self) {
|
|
|
|
|
+ self.camera_controller.update_camera(&mut self.camera);
|
|
|
|
|
+ self.camera_uniform.update_view_proj(&self.camera);
|
|
|
|
|
+ self.queue.write_buffer(&self.camera_buffer, 0, bytemuck::cast_slice(&[self.camera_uniform]));
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
pub fn render(&mut self) -> Result<(), wgpu::SurfaceError> {
|
|
pub fn render(&mut self) -> Result<(), wgpu::SurfaceError> {
|
|
|
let output = self.surface.get_current_texture()?;
|
|
let output = self.surface.get_current_texture()?;
|
|
@@ -221,6 +299,7 @@ impl<'a> State<'a> {
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
render_pass.set_pipeline(&self.render_pipeline);
|
|
render_pass.set_pipeline(&self.render_pipeline);
|
|
|
|
|
+ render_pass.set_bind_group(0, &self.camera_bind_group, &[]);
|
|
|
render_pass.set_vertex_buffer(0, self.vertex_buffer.slice(..));
|
|
render_pass.set_vertex_buffer(0, self.vertex_buffer.slice(..));
|
|
|
render_pass.draw(0..self.num_vertices,0..1);
|
|
render_pass.draw(0..self.num_vertices,0..1);
|
|
|
}
|
|
}
|