Tiled Forward Rendering #5

Merged
SeanOMik merged 15 commits from feature/tiled-forward-rendering into main 2024-03-23 14:38:43 +00:00
7 changed files with 49 additions and 13 deletions
Showing only changes of commit e2844a11a6 - Show all commits

View File

@ -86,6 +86,10 @@ pub fn free_fly_camera_controller(delta_time: Res<DeltaTime>, handler: Res<Actio
cam.transform.rotation = Quat::from_axis_angle(Vec3::Y, y) cam.transform.rotation = Quat::from_axis_angle(Vec3::Y, y)
* Quat::from_axis_angle(Vec3::X, x); * Quat::from_axis_angle(Vec3::X, x);
} }
if handler.was_action_just_pressed("Debug") {
cam.debug = !cam.debug;
}
} }
Ok(()) Ok(())

View File

@ -22,6 +22,7 @@ const ACTLBL_MOVE_FORWARD_BACKWARD: &str = "MoveForwardBackward";
const ACTLBL_LOOK_LEFT_RIGHT: &str = "LookLeftRight"; const ACTLBL_LOOK_LEFT_RIGHT: &str = "LookLeftRight";
const ACTLBL_LOOK_UP_DOWN: &str = "LookUpDown"; const ACTLBL_LOOK_UP_DOWN: &str = "LookUpDown";
const ACTLBL_LOOK_ROLL: &str = "LookRoll"; const ACTLBL_LOOK_ROLL: &str = "LookRoll";
const ACTLBL_DEBUG: &str = "Debug";
struct FixedTimestep { struct FixedTimestep {
max_tps: u32, max_tps: u32,
@ -127,7 +128,7 @@ async fn main() {
light_tran.rotate_y(math::Angle::Degrees(25.0)); light_tran.rotate_y(math::Angle::Degrees(25.0));
world.spawn(( world.spawn((
DirectionalLight { DirectionalLight {
enabled: false, enabled: true,
color: Vec3::ONE, color: Vec3::ONE,
intensity: 0.35 intensity: 0.35
//..Default::default() //..Default::default()
@ -175,7 +176,7 @@ async fn main() {
cube_mesh.clone(), cube_mesh.clone(),
)); ));
/* world.spawn(( world.spawn((
SpotLight { SpotLight {
enabled: true, enabled: true,
color: Vec3::new(1.0, 0.0, 0.0), color: Vec3::new(1.0, 0.0, 0.0),
@ -192,7 +193,7 @@ async fn main() {
Vec3::new(0.15, 0.15, 0.15), Vec3::new(0.15, 0.15, 0.15),
), ),
cube_mesh.clone(), cube_mesh.clone(),
)); */ ));
} }
/* { /* {
@ -310,6 +311,7 @@ async fn main() {
.add_action(ACTLBL_LOOK_LEFT_RIGHT, Action::new(ActionKind::Axis)) .add_action(ACTLBL_LOOK_LEFT_RIGHT, Action::new(ActionKind::Axis))
.add_action(ACTLBL_LOOK_UP_DOWN, Action::new(ActionKind::Axis)) .add_action(ACTLBL_LOOK_UP_DOWN, Action::new(ActionKind::Axis))
.add_action(ACTLBL_LOOK_ROLL, Action::new(ActionKind::Axis)) .add_action(ACTLBL_LOOK_ROLL, Action::new(ActionKind::Axis))
.add_action(ACTLBL_DEBUG, Action::new(ActionKind::Button))
.add_mapping(ActionMapping::builder(LayoutId::from(0), ActionMappingId::from(0)) .add_mapping(ActionMapping::builder(LayoutId::from(0), ActionMappingId::from(0))
.bind(ACTLBL_MOVE_FORWARD_BACKWARD, &[ .bind(ACTLBL_MOVE_FORWARD_BACKWARD, &[
@ -340,6 +342,9 @@ async fn main() {
ActionSource::Keyboard(KeyCode::E).into_binding_modifier(-1.0), ActionSource::Keyboard(KeyCode::E).into_binding_modifier(-1.0),
ActionSource::Keyboard(KeyCode::Q).into_binding_modifier(1.0), ActionSource::Keyboard(KeyCode::Q).into_binding_modifier(1.0),
]) ])
.bind(ACTLBL_DEBUG, &[
ActionSource::Keyboard(KeyCode::B).into_binding(),
])
.finish() .finish()
).finish(); ).finish();

View File

@ -93,11 +93,24 @@ impl<T: Button> InputButtons<T> {
let hash = Self::get_button_hash(&button); let hash = Self::get_button_hash(&button);
match self.button_events.get(&hash) { match self.button_events.get(&hash) {
Some(button_event) => match button_event { Some(button_event) => match button_event {
// this if statement should always be true, but just in case ;)
ButtonEvent::JustPressed(b) if button == *b => true, ButtonEvent::JustPressed(b) if button == *b => true,
_ => false, _ => false,
}, },
None => false None => false
} }
} }
/// Update any JustPressed events into Pressed events
///
/// This must be done so that a key does not stay as JustPressed between multiple ticks
pub fn update(&mut self) {
for bev in self.button_events.values_mut() {
match bev {
ButtonEvent::JustPressed(btn) => {
*bev = ButtonEvent::Pressed(btn.clone());
},
_ => {},
}
}
}
} }

View File

@ -102,12 +102,15 @@ impl crate::ecs::system::System for InputSystem {
let queue = world.try_get_resource_mut::<EventQueue>() let queue = world.try_get_resource_mut::<EventQueue>()
.and_then(|q| q.read_events::<InputEvent>()); .and_then(|q| q.read_events::<InputEvent>());
let mut e = world.get_resource_or_else(InputButtons::<winit::event::VirtualKeyCode>::new);
e.update();
drop(e);
if queue.is_none() { if queue.is_none() {
return Ok(()); return Ok(());
} }
let mut events = queue.unwrap(); let mut events = queue.unwrap();
while let Some(event) = events.pop_front() { while let Some(event) = events.pop_front() {
self.process_event(world, &event); self.process_event(world, &event);
} }

View File

@ -46,7 +46,8 @@ pub struct CameraUniform {
pub view_projection: glam::Mat4, pub view_projection: glam::Mat4,
/// The position of the camera /// The position of the camera
pub position: glam::Vec3, pub position: glam::Vec3,
_padding: u32, pub tile_debug: u32,
//_padding: [u8; 3],
} }
@ -57,7 +58,8 @@ impl Default for CameraUniform {
inverse_projection: glam::Mat4::IDENTITY, inverse_projection: glam::Mat4::IDENTITY,
view_projection: glam::Mat4::IDENTITY, view_projection: glam::Mat4::IDENTITY,
position: Default::default(), position: Default::default(),
_padding: 0, tile_debug: 0,
//_padding: 0,
} }
} }
} }
@ -69,7 +71,7 @@ impl CameraUniform {
inverse_projection, inverse_projection,
view_projection, view_projection,
position, position,
_padding: 0 tile_debug: 0
} }
} }
} }
@ -128,7 +130,7 @@ impl RenderCamera {
inverse_projection: proj.inverse(), inverse_projection: proj.inverse(),
view_projection: self.view_proj, view_projection: self.view_proj,
position, position,
_padding: 0, tile_debug: camera.debug as u32,
} }
}, },
CameraProjectionMode::Orthographic => { CameraProjectionMode::Orthographic => {
@ -150,7 +152,7 @@ impl RenderCamera {
inverse_projection: proj.inverse(), inverse_projection: proj.inverse(),
view_projection: self.view_proj, view_projection: self.view_proj,
position, position,
_padding: 0, tile_debug: camera.debug as u32,
} }
}, },
} }

View File

@ -24,6 +24,7 @@ struct CameraUniform {
inverse_projection: mat4x4<f32>, inverse_projection: mat4x4<f32>,
view_projection: mat4x4<f32>, view_projection: mat4x4<f32>,
position: vec3<f32>, position: vec3<f32>,
tile_debug: u32,
}; };
struct Light { struct Light {
@ -127,7 +128,10 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> {
return vec4<f32>(light_object_res, object_color.a);*/ return vec4<f32>(light_object_res, object_color.a);*/
if (u_camera.tile_debug == 1u) {
return debug_grid(in);
}
let tile_index = vec2<u32>(floor(in.clip_position.xy / 16.0)); let tile_index = vec2<u32>(floor(in.clip_position.xy / 16.0));
let tile: vec2<u32> = textureLoad(t_light_grid, tile_index).xy; let tile: vec2<u32> = textureLoad(t_light_grid, tile_index).xy;
@ -168,11 +172,14 @@ fn debug_grid(in: VertexOutput) -> vec4<f32> {
let ta: bool = x < 0.05 || y < 0.05; let ta: bool = x < 0.05 || y < 0.05;
let tb: bool = x > 0.95 || y > 0.95; let tb: bool = x > 0.95 || y > 0.95;
if ( ta || tb ) { let ratio = f32(tile.y) / f32(u_lights.light_count);
return vec4<f32>(ratio, ratio, ratio, 1.0);
/* if ( ta || tb ) {
return vec4<f32>(0.0, 0.0, 0.0, 1.0); return vec4<f32>(0.0, 0.0, 0.0, 1.0);
} else { } else {
return vec4<f32>(f32(tile_index.x) / 50.0, f32(tile_index.y) / 38.0, 0.0, 1.0); return vec4<f32>(f32(tile_index.x) / 50.0, f32(tile_index.y) / 38.0, 0.0, 1.0);
} } */
} }
fn blinn_phong_dir_light(world_pos: vec3<f32>, world_norm: vec3<f32>, dir_light: Light, material: Material, specular_factor: vec3<f32>) -> vec3<f32> { fn blinn_phong_dir_light(world_pos: vec3<f32>, world_norm: vec3<f32>, dir_light: Light, material: Material, specular_factor: vec3<f32>) -> vec3<f32> {

View File

@ -7,6 +7,7 @@ pub struct CameraComponent {
pub transform: Transform, pub transform: Transform,
pub fov: Angle, pub fov: Angle,
pub mode: CameraProjectionMode, pub mode: CameraProjectionMode,
pub debug: bool,
} }
impl Default for CameraComponent { impl Default for CameraComponent {
@ -15,6 +16,7 @@ impl Default for CameraComponent {
transform: Transform::default(), transform: Transform::default(),
fov: Angle::Degrees(45.0), fov: Angle::Degrees(45.0),
mode: CameraProjectionMode::Perspective, mode: CameraProjectionMode::Perspective,
debug: false,
} }
} }
} }