Compare commits
3 Commits
28576035eb
...
33bea8fbc8
| Author | SHA1 | Date | |
|---|---|---|---|
| 33bea8fbc8 | |||
| 668696bdca | |||
| 6ecd5b6082 |
@@ -97,4 +97,5 @@ name = "look_vertical"
|
|||||||
touch_axis = "vertical"
|
touch_axis = "vertical"
|
||||||
|
|
||||||
[config]
|
[config]
|
||||||
line_height_px = 16
|
line_height_px = 16
|
||||||
|
mouse_speed = 0.01
|
||||||
@@ -35,6 +35,7 @@ out gl_PerVertex {
|
|||||||
void main() {
|
void main() {
|
||||||
// Vertex position in camera
|
// Vertex position in camera
|
||||||
gl_Position = ubo.projection * ubo.view * push.model * vec4(position, 1.0);
|
gl_Position = ubo.projection * ubo.view * push.model * vec4(position, 1.0);
|
||||||
|
// gl_Position.y = -gl_Position.y;
|
||||||
|
|
||||||
// Vertex position in world
|
// Vertex position in world
|
||||||
position_wld = vec3(push.model * vec4(position, 1.0));
|
position_wld = vec3(push.model * vec4(position, 1.0));
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use cgmath::{Vector4, vec4};
|
use cgmath::{Vector4, vec4};
|
||||||
|
|
||||||
use crate::{input::InputState, text::{create_text_object, update_text}, vulkan::{MeshHandle, PERF_COUNTER_SIZE, TextVertex, VulkanRenderer, gameobject::{GameObject, GameObjectHandle, Updatable}, mesh::{CPUMesh, CPUVertexList}}};
|
use crate::{input::InputState, text::{create_text_object, update_text}, vulkan::{MeshHandle, PERF_COUNTER_SIZE, TextVertex, Vertex, VulkanRenderer, gameobject::{GameObject, GameObjectHandle, Updatable}, mesh::{CPUMesh, CPUVertexList}}};
|
||||||
|
|
||||||
use super::{GameState, TestGame};
|
use super::{GameState, TestGame};
|
||||||
|
|
||||||
@@ -31,6 +31,31 @@ impl Updatable for FpsCounter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct WorldQuad {
|
||||||
|
pub game_object: GameObjectHandle,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl WorldQuad {
|
||||||
|
pub fn new(game: &mut TestGame, renderer: &mut VulkanRenderer) -> WorldQuad {
|
||||||
|
let quad_verts = vec![
|
||||||
|
Vertex { position: [0., 0., 0.], uv: [0., 0.], normal: [0., 1., 0.], tangent: [1., 0., 0., 1.], bone_index: [0, 0, 0, 0], bone_weight: [0., 0., 0., 0.] },
|
||||||
|
Vertex { position: [1., 0., 0.], uv: [1., 0.], normal: [0., 1., 0.], tangent: [1., 0., 0., 1.], bone_index: [0, 0, 0, 0], bone_weight: [0., 0., 0., 0.] },
|
||||||
|
Vertex { position: [0., 0., 1.], uv: [0., 1.], normal: [0., 1., 0.], tangent: [1., 0., 0., 1.], bone_index: [0, 0, 0, 0], bone_weight: [0., 0., 0., 0.] },
|
||||||
|
Vertex { position: [1., 0., 1.], uv: [1., 1.], normal: [0., 1., 0.], tangent: [1., 0., 0., 1.], bone_index: [0, 0, 0, 0], bone_weight: [0., 0., 0., 0.] },
|
||||||
|
];
|
||||||
|
let cpu_mesh = CPUMesh { vertices: CPUVertexList::Vertex3D(quad_verts), indices: vec![0, 2, 1, 1, 2, 3], local_texture_index: None, local_normal_map_index: None, name: None };
|
||||||
|
let mesh_index = renderer.upload_mesh(cpu_mesh, None);
|
||||||
|
let mesh_handle = MeshHandle {
|
||||||
|
index: mesh_index,
|
||||||
|
textures: vec![1, 0],
|
||||||
|
original_path: None,
|
||||||
|
pipeline_index: 0
|
||||||
|
};
|
||||||
|
let game_object = game.add_game_object(renderer, mesh_handle);
|
||||||
|
WorldQuad { game_object }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct UiQuad {
|
pub struct UiQuad {
|
||||||
pub game_object: GameObjectHandle,
|
pub game_object: GameObjectHandle,
|
||||||
pub background_color: Vector4<f32>,
|
pub background_color: Vector4<f32>,
|
||||||
@@ -44,7 +69,7 @@ impl UiQuad {
|
|||||||
TextVertex { position: [1., 0., 0.], uv: [1., 0.] },
|
TextVertex { position: [1., 0., 0.], uv: [1., 0.] },
|
||||||
TextVertex { position: [1., 1., 0.], uv: [1., 1.] },
|
TextVertex { position: [1., 1., 0.], uv: [1., 1.] },
|
||||||
];
|
];
|
||||||
let cpu_mesh = CPUMesh { vertices: CPUVertexList::VertexText(quad_verts), indices: vec![0, 1, 2, 1, 3, 2], local_texture_index: None, local_normal_map_index: None, name: None };
|
let cpu_mesh = CPUMesh { vertices: CPUVertexList::VertexText(quad_verts), indices: vec![0, 2, 1, 1, 2, 3], local_texture_index: None, local_normal_map_index: None, name: None };
|
||||||
let mesh_index = renderer.upload_mesh(cpu_mesh, None);
|
let mesh_index = renderer.upload_mesh(cpu_mesh, None);
|
||||||
let mesh_handle = MeshHandle {
|
let mesh_handle = MeshHandle {
|
||||||
index: mesh_index,
|
index: mesh_index,
|
||||||
|
|||||||
@@ -6,14 +6,14 @@ use winit::event::Event;
|
|||||||
use level::{load_level, save_level};
|
use level::{load_level, save_level};
|
||||||
use player::Player;
|
use player::Player;
|
||||||
|
|
||||||
use crate::game::entities::{FpsCounter, UiQuad};
|
use crate::game::entities::{FpsCounter, UiQuad, WorldQuad};
|
||||||
use crate::text::create_brush;
|
use crate::text::create_brush;
|
||||||
|
use crate::vulkan::pipelines::vs;
|
||||||
use crate::{config::LogConfig, vulkan};
|
use crate::{config::LogConfig, vulkan};
|
||||||
use crate::input::InputState;
|
use crate::input::InputState;
|
||||||
use crate::vulkan::{Game, MeshHandle, TextVertex, Vertex, VulkanRenderer};
|
use crate::vulkan::{Game, MeshHandle, TextVertex, Vertex, VulkanRenderer};
|
||||||
use crate::vulkan::gameobject::{GameObject, GameObjectHandle, Updatable};
|
use crate::vulkan::gameobject::{GameObject, GameObjectHandle, Updatable};
|
||||||
use crate::vulkan::mesh;
|
use crate::vulkan::mesh;
|
||||||
use crate::vulkan::pipelines::vs::ty::ObjectUniformData;
|
|
||||||
|
|
||||||
pub mod player;
|
pub mod player;
|
||||||
mod level;
|
mod level;
|
||||||
@@ -44,6 +44,7 @@ pub struct TestGame {
|
|||||||
pub last_time: f32,
|
pub last_time: f32,
|
||||||
pub components: Vec<Box<dyn Updatable>>,
|
pub components: Vec<Box<dyn Updatable>>,
|
||||||
pub game_state: GameState,
|
pub game_state: GameState,
|
||||||
|
pub ubo: vs::ty::ObjectUniformData,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Game for TestGame {
|
impl Game for TestGame {
|
||||||
@@ -55,7 +56,7 @@ impl Game for TestGame {
|
|||||||
self.input.on_window_event(event);
|
self.input.on_window_event(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update(self: &mut Self, renderer: &mut VulkanRenderer) -> ObjectUniformData {
|
fn update(self: &mut Self, renderer: &mut VulkanRenderer) {
|
||||||
let precise_start = Instant::now();
|
let precise_start = Instant::now();
|
||||||
|
|
||||||
// Input and timing
|
// Input and timing
|
||||||
@@ -113,10 +114,7 @@ impl Game for TestGame {
|
|||||||
self.last_time = time;
|
self.last_time = time;
|
||||||
self.input.frame_end();
|
self.input.frame_end();
|
||||||
|
|
||||||
let precise_duration = precise_start.elapsed().as_micros();
|
self.ubo = vs::ty::ObjectUniformData {
|
||||||
renderer.game_data.update_perf_counters[renderer.game_data.performance_counter_index] = precise_duration;
|
|
||||||
|
|
||||||
ObjectUniformData {
|
|
||||||
view: self.player.camera.view.into(),
|
view: self.player.camera.view.into(),
|
||||||
projection: self.player.camera.proj.into(),
|
projection: self.player.camera.proj.into(),
|
||||||
ortho_projection: self.player.camera.ortho_proj.into(),
|
ortho_projection: self.player.camera.ortho_proj.into(),
|
||||||
@@ -127,7 +125,14 @@ impl Game for TestGame {
|
|||||||
_dummy0: [0; 12],
|
_dummy0: [0; 12],
|
||||||
_dummy1: [0; 4],
|
_dummy1: [0; 4],
|
||||||
_dummy2: [0; 4],
|
_dummy2: [0; 4],
|
||||||
}
|
};
|
||||||
|
|
||||||
|
let precise_duration = precise_start.elapsed().as_micros();
|
||||||
|
renderer.game_data.update_perf_counters[renderer.game_data.performance_counter_index] = precise_duration;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_ubo(&self) -> &vs::ty::ObjectUniformData {
|
||||||
|
&self.ubo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,7 +146,19 @@ impl TestGame {
|
|||||||
texture_index_counter: 0,
|
texture_index_counter: 0,
|
||||||
last_time: 0.0,
|
last_time: 0.0,
|
||||||
components: vec![],
|
components: vec![],
|
||||||
game_state: GameState::new()
|
game_state: GameState::new(),
|
||||||
|
ubo: vs::ty::ObjectUniformData {
|
||||||
|
view: [[0.; 4]; 4],
|
||||||
|
projection: [[0.; 4]; 4],
|
||||||
|
ortho_projection: [[0.; 4]; 4],
|
||||||
|
time: 0.,
|
||||||
|
light_position: [0.; 3],
|
||||||
|
light_directional_rotation: [0.; 3],
|
||||||
|
camera_position: [0.; 3],
|
||||||
|
_dummy0: [0; 12],
|
||||||
|
_dummy1: [0; 4],
|
||||||
|
_dummy2: [0; 4],
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,6 +170,11 @@ impl TestGame {
|
|||||||
|
|
||||||
let test_quad = UiQuad::new(self, renderer);
|
let test_quad = UiQuad::new(self, renderer);
|
||||||
self.components.push(Box::new(test_quad));
|
self.components.push(Box::new(test_quad));
|
||||||
|
|
||||||
|
let world_quad = WorldQuad::new(self, renderer);
|
||||||
|
let quad_go = &mut self.game_objects[world_quad.game_object];
|
||||||
|
quad_go.position = vec3(0.0, 0.01, 0.0);
|
||||||
|
quad_go.scale = vec3(10., 10., 10.);
|
||||||
|
|
||||||
println!("Game loaded!");
|
println!("Game loaded!");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ use cgmath::{Deg, InnerSpace, Matrix4, One, Quaternion, Rad, Rotation, Rotation3
|
|||||||
use crate::game::player::PlayerMovementMode::{FirstPerson, Flying};
|
use crate::game::player::PlayerMovementMode::{FirstPerson, Flying};
|
||||||
|
|
||||||
use crate::input::InputState;
|
use crate::input::InputState;
|
||||||
use crate::util::{intersection_distance, print_matrix};
|
use crate::util::intersection_distance;
|
||||||
use crate::vulkan::gameobject::GameObject;
|
use crate::vulkan::gameobject::GameObject;
|
||||||
use crate::vulkan::{
|
use crate::vulkan::{
|
||||||
gameobject::Updatable,
|
gameobject::Updatable,
|
||||||
@@ -143,14 +143,14 @@ impl Updatable for Player {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Rotation
|
// Rotation
|
||||||
self.x_look += input.get_axis("look_vertical") * delta_time * self.look_sensitivity;
|
self.x_look += input.get_axis_timescaled("look_vertical", delta_time) * self.look_sensitivity;
|
||||||
self.y_look += input.get_axis("look_horizontal") * delta_time * self.look_sensitivity;
|
self.y_look += input.get_axis_timescaled("look_horizontal", delta_time) * self.look_sensitivity;
|
||||||
let x_rot = Quaternion::from_angle_x(Deg(self.x_look));
|
let x_rot = Quaternion::from_angle_x(Deg(self.x_look));
|
||||||
let y_rot = Quaternion::from_angle_y(Deg(self.y_look));
|
let y_rot = Quaternion::from_angle_y(Deg(self.y_look));
|
||||||
self.camera.rotation = x_rot * y_rot;
|
self.camera.rotation = x_rot * y_rot;
|
||||||
|
|
||||||
// Movement
|
// Movement
|
||||||
let local_input = vec3(input.get_axis("move_right"), 0.0, -input.get_axis("move_forward")) * self.movement_speed * delta_time;
|
let local_input = vec3(input.get_axis_timescaled("move_right", delta_time), 0.0, -input.get_axis_timescaled("move_forward", delta_time)) * self.movement_speed;
|
||||||
|
|
||||||
if self.movement_mode == FirstPerson {
|
if self.movement_mode == FirstPerson {
|
||||||
let mut world_input = self.camera.local_to_world(local_input);
|
let mut world_input = self.camera.local_to_world(local_input);
|
||||||
|
|||||||
13
src/input.rs
13
src/input.rs
@@ -43,6 +43,7 @@ struct InputConfig {
|
|||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
struct InputConfigConfig {
|
struct InputConfigConfig {
|
||||||
line_height_px: f32,
|
line_height_px: f32,
|
||||||
|
mouse_speed: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
@@ -399,30 +400,30 @@ impl InputState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_axis(self: &Self, axis_code: &str) -> f32 {
|
pub fn get_axis_timescaled(self: &Self, axis_code: &str, delta_time: f32) -> f32 {
|
||||||
if let Some(axis) = self.virtual_axes.get(axis_code) {
|
if let Some(axis) = self.virtual_axes.get(axis_code) {
|
||||||
axis.axis_inputs.iter().map(|item| {
|
axis.axis_inputs.iter().map(|item| {
|
||||||
match &item {
|
match &item {
|
||||||
AxisInput::Wheel(modifiers) => {
|
AxisInput::Wheel(modifiers) => {
|
||||||
if self.modifiers_are_pressed(modifiers) { self.analog_wheel_state } else { 0.0 }
|
if self.modifiers_are_pressed(modifiers) { self.analog_wheel_state * delta_time } else { 0.0 }
|
||||||
},
|
},
|
||||||
AxisInput::MouseMove(direction, modifiers) => {
|
AxisInput::MouseMove(direction, modifiers) => {
|
||||||
if self.modifiers_are_pressed(modifiers) {
|
if self.modifiers_are_pressed(modifiers) {
|
||||||
match direction {
|
match direction {
|
||||||
MouseMoveDirection::X => self.mouse_delta_x as f32,
|
MouseMoveDirection::X => self.mouse_delta_x as f32 * self.config.mouse_speed,
|
||||||
MouseMoveDirection::Y => self.mouse_delta_y as f32,
|
MouseMoveDirection::Y => self.mouse_delta_y as f32 * self.config.mouse_speed,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
0.0
|
0.0
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
AxisInput::Digital(positive_button, negative_button) => {
|
AxisInput::Digital(positive_button, negative_button) => {
|
||||||
self.virtual_button_to_float(positive_button) - self.virtual_button_to_float(negative_button)
|
(self.virtual_button_to_float(positive_button) - self.virtual_button_to_float(negative_button)) * delta_time
|
||||||
},
|
},
|
||||||
AxisInput::Controller(controller_input) => {
|
AxisInput::Controller(controller_input) => {
|
||||||
self.controller_input.gamepads()
|
self.controller_input.gamepads()
|
||||||
.map(|(_id, gamepad)| gamepad.value(controller_input.axis))
|
.map(|(_id, gamepad)| gamepad.value(controller_input.axis))
|
||||||
.fold(0.0, fold_axis_value)
|
.fold(0.0, fold_axis_value) * delta_time
|
||||||
},
|
},
|
||||||
&AxisInput::Touch(touch_axis) => {
|
&AxisInput::Touch(touch_axis) => {
|
||||||
match touch_axis {
|
match touch_axis {
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
#[allow(deprecated)]
|
#[allow(deprecated)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use cgmath::{vec3};
|
use cgmath::vec3;
|
||||||
use winit::{dpi::PhysicalPosition, event::{DeviceId, ElementState, Event, Force, KeyboardInput, ModifiersState, Touch, TouchPhase, WindowEvent}, window::WindowId};
|
use winit::{dpi::PhysicalPosition, event::{DeviceId, ElementState, Event, Force, KeyboardInput, ModifiersState, Touch, TouchPhase, WindowEvent}, window::WindowId};
|
||||||
|
|
||||||
use crate::{config::LogConfig, game::player::{intersect_triangle}, input::InputState};
|
use crate::{config::LogConfig, input::InputState, util::intersect_triangle};
|
||||||
use crate::input::vk_to_scan_code;
|
use crate::input::vk_to_scan_code;
|
||||||
|
|
||||||
fn epsilon_eq(f1: f32, f2: f32) {
|
fn epsilon_eq(f1: f32, f2: f32) {
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ use vulkano::buffer::TypedBufferAccess;
|
|||||||
|
|
||||||
use crate::vulkan::{Mesh, gameobject::GameObject};
|
use crate::vulkan::{Mesh, gameobject::GameObject};
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
pub fn print_matrix(mat: Matrix4<f32>) {
|
pub fn print_matrix(mat: Matrix4<f32>) {
|
||||||
let cols = [
|
let cols = [
|
||||||
[mat.x.x, mat.x.y, mat.x.z, mat.x.w],
|
[mat.x.x, mat.x.y, mat.x.z, mat.x.w],
|
||||||
|
|||||||
@@ -89,12 +89,20 @@ pub fn load_mesh<V>(mesh_path: &str, print_status: bool) -> Result<(Vec<CPUMesh>
|
|||||||
reader.read_joints(0),
|
reader.read_joints(0),
|
||||||
reader.read_weights(0));
|
reader.read_weights(0));
|
||||||
|
|
||||||
let verts = vertices_result?;
|
let mut verts = vertices_result?;
|
||||||
|
verts.iter_mut().for_each(|v| {
|
||||||
|
v.position[1] = -v.position[1];
|
||||||
|
v.normal[1] = -v.normal[1];
|
||||||
|
});
|
||||||
|
|
||||||
let vert_count = verts.len();
|
let vert_count = verts.len();
|
||||||
|
|
||||||
|
let mut inds: Vec<u32> = indices.into_u32().collect();
|
||||||
|
inds.reverse();
|
||||||
|
|
||||||
let cpu_mesh = CPUMesh {
|
let cpu_mesh = CPUMesh {
|
||||||
vertices: CPUVertexList::Vertex3D(verts),
|
vertices: CPUVertexList::Vertex3D(verts),
|
||||||
indices: indices.into_u32().collect(),
|
indices: inds,
|
||||||
local_texture_index: texture_index,
|
local_texture_index: texture_index,
|
||||||
local_normal_map_index: normal_map_index,
|
local_normal_map_index: normal_map_index,
|
||||||
name: mesh.name().map(|n| n.to_owned()),
|
name: mesh.name().map(|n| n.to_owned()),
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ use winit::event::{Event, WindowEvent};
|
|||||||
use winit::event_loop::{ControlFlow, EventLoop};
|
use winit::event_loop::{ControlFlow, EventLoop};
|
||||||
|
|
||||||
use mesh::CPUMesh;
|
use mesh::CPUMesh;
|
||||||
use pipelines::{Drawcall};
|
use pipelines::Drawcall;
|
||||||
use pipelines::{DefaultShader, TextShader};
|
use pipelines::{DefaultShader, TextShader};
|
||||||
use pipelines::vs;
|
use pipelines::vs;
|
||||||
use winit::window::{Window, WindowBuilder};
|
use winit::window::{Window, WindowBuilder};
|
||||||
@@ -31,7 +31,7 @@ use winit::window::{Window, WindowBuilder};
|
|||||||
use crate::config::RenderConfig;
|
use crate::config::RenderConfig;
|
||||||
use crate::vulkan::gameobject::GameObject;
|
use crate::vulkan::gameobject::GameObject;
|
||||||
|
|
||||||
use self::mesh::{CPUVertexList};
|
use self::mesh::CPUVertexList;
|
||||||
|
|
||||||
pub mod pipelines;
|
pub mod pipelines;
|
||||||
pub mod gameobject;
|
pub mod gameobject;
|
||||||
@@ -78,9 +78,11 @@ pub trait Game {
|
|||||||
/// Returns true if event should be ignored by the vulkan handler
|
/// Returns true if event should be ignored by the vulkan handler
|
||||||
fn on_window_event(self: &mut Self, event: &Event<()>);
|
fn on_window_event(self: &mut Self, event: &Event<()>);
|
||||||
|
|
||||||
fn update(self: &mut Self, renderer: &mut VulkanRenderer) -> vs::ty::ObjectUniformData;
|
fn update(self: &mut Self, renderer: &mut VulkanRenderer);
|
||||||
|
|
||||||
fn get_game_objects(&self) -> &Vec<GameObject>;
|
fn get_game_objects(&self) -> &Vec<GameObject>;
|
||||||
|
|
||||||
|
fn get_ubo(&self) -> &vs::ty::ObjectUniformData;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Mesh<V> {
|
pub struct Mesh<V> {
|
||||||
@@ -230,7 +232,7 @@ impl VulkanRenderer {
|
|||||||
q.supports_graphics() && surface.is_supported(q).unwrap_or(false)
|
q.supports_graphics() && surface.is_supported(q).unwrap_or(false)
|
||||||
}).unwrap();
|
}).unwrap();
|
||||||
|
|
||||||
let device_ext = DeviceExtensions { khr_swapchain: true, ..DeviceExtensions::none() };
|
let device_ext = DeviceExtensions { khr_swapchain: true, khr_maintenance1: true, ..DeviceExtensions::none() };
|
||||||
let (device, mut queues) = Device::new(physical, &Features::none(), &device_ext,
|
let (device, mut queues) = Device::new(physical, &Features::none(), &device_ext,
|
||||||
[(queue_family, 0.5)].iter().cloned()).unwrap();
|
[(queue_family, 0.5)].iter().cloned()).unwrap();
|
||||||
let queue = queues.next().unwrap();
|
let queue = queues.next().unwrap();
|
||||||
@@ -261,11 +263,7 @@ impl VulkanRenderer {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let size = images[0].dimensions().width_height();
|
let size = images[0].dimensions().width_height();
|
||||||
let viewport = Viewport {
|
let viewport = create_viewport(size[0] as f32, size[1] as f32);
|
||||||
origin: [0.0, 0.0],
|
|
||||||
dimensions: [size[0] as f32, size[1] as f32],
|
|
||||||
depth_range: 0.0..1.0,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Render pass
|
// Render pass
|
||||||
let render_pass = renderpass::create_render_pass(device.clone(), &render_config, swapchain.format());
|
let render_pass = renderpass::create_render_pass(device.clone(), &render_config, swapchain.format());
|
||||||
@@ -319,10 +317,10 @@ impl VulkanRenderer {
|
|||||||
}, events_loop)
|
}, events_loop)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_command_buffer(self: &mut Self, fb_index: usize, uniform_buffer_data: vs::ty::ObjectUniformData, game_objects: &Vec<GameObject>) -> Arc<PrimaryAutoCommandBuffer> {
|
fn create_command_buffer(self: &mut Self, fb_index: usize, uniform_buffer_data: &vs::ty::ObjectUniformData, game_objects: &Vec<GameObject>) -> Arc<PrimaryAutoCommandBuffer> {
|
||||||
// General setup
|
// General setup
|
||||||
let mut builder = AutoCommandBufferBuilder::primary(self.device.clone(), self.queue.family(), CommandBufferUsage::OneTimeSubmit).unwrap();
|
let mut builder = AutoCommandBufferBuilder::primary(self.device.clone(), self.queue.family(), CommandBufferUsage::OneTimeSubmit).unwrap();
|
||||||
builder.update_buffer(self.uniform_buffers[fb_index].clone(), Arc::new(uniform_buffer_data)).unwrap();
|
builder.update_buffer(self.uniform_buffers[fb_index].clone(), Arc::new(*uniform_buffer_data)).unwrap();
|
||||||
if self.render_config.msaa_samples > 0 {
|
if self.render_config.msaa_samples > 0 {
|
||||||
builder.begin_render_pass(self.framebuffers[fb_index].clone(), SubpassContents::Inline, vec![ClearValue::None, ClearValue::Float([0.0, 0.0, 0.0, 1.0]), ClearValue::Depth(1.0)]).unwrap();
|
builder.begin_render_pass(self.framebuffers[fb_index].clone(), SubpassContents::Inline, vec![ClearValue::None, ClearValue::Float([0.0, 0.0, 0.0, 1.0]), ClearValue::Depth(1.0)]).unwrap();
|
||||||
} else {
|
} else {
|
||||||
@@ -344,7 +342,7 @@ impl VulkanRenderer {
|
|||||||
Arc::new(builder.build().unwrap())
|
Arc::new(builder.build().unwrap())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn render_loop(self: &mut Self, new_ubo: vs::ty::ObjectUniformData, game_objects: &Vec<GameObject>) {
|
pub fn render_loop(self: &mut Self, new_ubo: &vs::ty::ObjectUniformData, game_objects: &Vec<GameObject>) {
|
||||||
let precise_start = Instant::now();
|
let precise_start = Instant::now();
|
||||||
|
|
||||||
// cleanup previous frame
|
// cleanup previous frame
|
||||||
@@ -368,12 +366,7 @@ impl VulkanRenderer {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let size = new_images[0].dimensions().width_height();
|
let size = new_images[0].dimensions().width_height();
|
||||||
|
self.viewport = create_viewport(size[0] as f32, size[1] as f32);
|
||||||
self.viewport = Viewport {
|
|
||||||
origin: [0.0, 0.0],
|
|
||||||
dimensions: [size[0] as f32, size[1] as f32],
|
|
||||||
depth_range: 0.0..1.0,
|
|
||||||
};
|
|
||||||
|
|
||||||
self.render_pass = renderpass::create_render_pass(self.device.clone(), &self.render_config, new_swapchain.format());
|
self.render_pass = renderpass::create_render_pass(self.device.clone(), &self.render_config, new_swapchain.format());
|
||||||
|
|
||||||
@@ -694,15 +687,33 @@ pub fn start_event_loop(mut renderer: VulkanRenderer, mut game: Box<dyn Game>, e
|
|||||||
Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => {
|
Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => {
|
||||||
*control_flow = ControlFlow::Exit;
|
*control_flow = ControlFlow::Exit;
|
||||||
},
|
},
|
||||||
Event::RedrawEventsCleared => {
|
Event::WindowEvent { event: WindowEvent::Resized(..), .. } => {
|
||||||
let ubo = game.update(&mut renderer);
|
renderer.recreate_swapchain = true;
|
||||||
renderer.render_loop(ubo, &game.get_game_objects());
|
},
|
||||||
|
Event::RedrawRequested(..) => {
|
||||||
|
renderer.render_loop(game.get_ubo(), &game.get_game_objects());
|
||||||
renderer.game_data.other_perf_counters[renderer.game_data.performance_counter_index] = renderer.game_data.other_perf_instant.elapsed().as_micros();
|
renderer.game_data.other_perf_counters[renderer.game_data.performance_counter_index] = renderer.game_data.other_perf_instant.elapsed().as_micros();
|
||||||
renderer.game_data.other_perf_instant = Instant::now();
|
renderer.game_data.other_perf_instant = Instant::now();
|
||||||
renderer.game_data.performance_counter_index = (renderer.game_data.performance_counter_index + 1) % PERF_COUNTER_SIZE;
|
renderer.game_data.performance_counter_index = (renderer.game_data.performance_counter_index + 1) % PERF_COUNTER_SIZE;
|
||||||
},
|
},
|
||||||
|
Event::MainEventsCleared => {
|
||||||
|
game.update(&mut renderer);
|
||||||
|
renderer.surface.window().request_redraw();
|
||||||
|
},
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn create_viewport(width: f32, height: f32) -> Viewport {
|
||||||
|
Viewport {
|
||||||
|
origin: [0.0, 0.0],
|
||||||
|
dimensions: [width, height],
|
||||||
|
depth_range: 0.0..1.0,
|
||||||
|
}
|
||||||
|
// Viewport {
|
||||||
|
// origin: [0.0, height],
|
||||||
|
// dimensions: [width, -height],
|
||||||
|
// depth_range: 0.0..1.0,
|
||||||
|
// }
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user