First person controller

This commit is contained in:
2026-02-11 20:09:51 +01:00
parent fecc1f1718
commit f05ed2e613
3 changed files with 83 additions and 50 deletions

View File

@@ -50,9 +50,8 @@ fn fragment(in: FullscreenVertexOutput) -> @location(0) vec4<f32> {
let x: i32 = i32(uvx * settings.scale) % 8;
let y: i32 = i32(uvy * settings.scale) % 8;
let final_gray = find_closest(x, y, grayscale); /// not even used?!
let final_gray = find_closest(x, y, grayscale);
// Sample each color channel with an arbitrary shift
return vec4<f32>(
final_gray, final_gray, final_gray, 0.0
);

View File

@@ -1,9 +1,10 @@
use std::f32::consts::PI;
use std::f32::consts::*;
use std::time::Duration;
use bevy::app::ScheduleRunnerPlugin;
use bevy::camera::RenderTarget;
use bevy::color::Color;
use bevy::color::palettes::css::WHITE;
use bevy::prelude::*;
use wgpu::{TextureFormat, TextureUsages};
@@ -12,12 +13,11 @@ mod post_process;
use crate::post_process::PostProcessSettings;
use crate::renderer::{G13Resource, ImageExport, ImageExportPlugin, ImageExportSource};
use crate::shared::Spinner;
mod renderer;
mod shared;
const USE_G13: bool = false;
const USE_G13: bool = true;
fn main() {
let mut app = App::new();
@@ -42,14 +42,20 @@ fn main() {
)));
}
app.insert_resource(ClearColor(Color::linear_rgba(0.0, 0.0, 0.0, 0.0)))
.add_systems(Startup, (setup_camera, shared::spawn_3d_scene))
app.insert_resource(GlobalAmbientLight {
color: WHITE.into(),
brightness: 400.0,
..default()
});
app.insert_resource(ClearColor(Color::linear_rgba(0.01, 0.01, 0.01, 1.0)))
.add_systems(Startup, (setup_player, shared::spawn_3d_scene))
// .add_systems(PostStartup, spawn_ui)
.add_systems(Update, rotate_cube)
.add_systems(Update, camera_controller)
.run();
}
fn setup_camera(
fn setup_player(
mut commands: Commands,
mut images: ResMut<Assets<Image>>,
mut export_sources: ResMut<Assets<ImageExportSource>>,
@@ -57,7 +63,7 @@ fn setup_camera(
let mut camera_commands = commands.spawn((
Camera3d::default(),
Camera::default(),
Transform::from_xyz(0.0, 1.0, 2.5).looking_at(Vec3::ZERO, Vec3::Y),
Transform::from_xyz(0.0, 1.0, 2.5),
UiAntiAlias::Off,
bevy::core_pipeline::prepass::DepthPrepass,
bevy::core_pipeline::prepass::NormalPrepass,
@@ -68,6 +74,19 @@ fn setup_camera(
..default()
},
PostProcessSettings { scale: 1.0 },
children![
SpotLight {
color: Color::WHITE,
intensity: light_consts::lumens::VERY_LARGE_CINEMA_LIGHT * 5.0,
range: 32.0,
inner_angle: FRAC_PI_8,
outer_angle: FRAC_PI_2,
shadows_enabled: true,
affects_lightmapped_mesh_diffuse: true,
..default()
},
Transform::from_xyz(0., 0., 0.),
],
));
if USE_G13 {
@@ -115,13 +134,18 @@ fn setup_camera(
// ));
// }
fn rotate_cube(
mut cubes: Query<(&mut Transform, &Spinner)>,
fn camera_controller(
camera: Single<(&mut Transform), With<Camera>>,
timer: Res<Time>,
g13: Res<G13Resource>,
) {
let (mut transform) = camera.into_inner();
const DEADZONE: i32 = 35;
let sensitivity = Vec2::new(2.0, 1.25);
let speed = 2.0;
let g13 = g13.g13.state();
let mut x = g13.x as f32 / 512.0;
let mut y = g13.y as f32 / 512.0;
@@ -134,8 +158,35 @@ fn rotate_cube(
y = 0.0;
}
for (mut transform, _cube) in &mut cubes {
transform.rotate_y(x * PI * timer.delta_secs());
transform.rotate_x(y * PI * timer.delta_secs());
let delta_yaw = -x * sensitivity.x * timer.delta_secs();
let delta_pitch = -y * sensitivity.y * timer.delta_secs();
let (yaw, pitch, roll) = transform.rotation.to_euler(EulerRot::YXZ);
let yaw = yaw + delta_yaw;
const PITCH_LIMIT: f32 = FRAC_PI_2 - 0.01;
let pitch = (pitch + delta_pitch).clamp(-PITCH_LIMIT, PITCH_LIMIT);
transform.rotation = Quat::from_euler(EulerRot::YXZ, yaw, pitch, roll);
let forward = transform.forward();
let forward = Vec3::new(forward.x, 0.0, forward.z).normalize();
let left = transform.left();
let left = Vec3::new(left.x, 0.0, left.z).normalize();
if g13.buttons.g4 {
transform.translation += forward * speed * timer.delta_secs();
}
if g13.buttons.g11 {
transform.translation -= forward * speed * timer.delta_secs();
}
if g13.buttons.g10 {
transform.translation += left * speed * timer.delta_secs();
}
if g13.buttons.g12 {
transform.translation -= left * speed * timer.delta_secs();
}
}

View File

@@ -1,47 +1,30 @@
use bevy::prelude::*;
#[allow(dead_code)]
#[derive(Component)]
pub struct Spinner;
#[allow(dead_code)]
#[derive(Resource, Default)]
pub struct Flags {
pub debug: bool,
}
#[allow(dead_code)]
pub fn spawn_3d_scene(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
) {
commands.spawn((
Mesh3d(meshes.add(Cylinder::default())),
MeshMaterial3d(materials.add(Color::from(bevy::color::palettes::css::WHITE))),
Transform::from_xyz(0.0, 0.0, 0.0),
Spinner,
let mesh = meshes.add(Plane3d::new(
Vec3::new(0.0, 1.0, 0.0),
Vec2::new(0.99, 0.99),
));
let material = materials.add(Color::from(bevy::color::palettes::css::WHITE));
for z in -10..10 {
for x in -10..10 {
// if ((z + x) % 2) == 0 {
commands.spawn((
PointLight {
intensity: 6_000_000.,
shadows_enabled: true,
..Default::default()
},
Transform::from_xyz(3., 4., 6.),
Mesh3d(mesh.clone()),
MeshMaterial3d(material.clone()),
Transform::from_xyz(x as f32 * 2.0, 0.0, z as f32 * 2.0),
));
// }
}
}
#[allow(dead_code)]
pub fn spawn_2d_scene(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<ColorMaterial>>,
) {
commands.spawn((
Spinner,
Mesh2d(meshes.add(RegularPolygon::new(66.0, 8))),
MeshMaterial2d(materials.add(Color::srgb(0.4, 0.4, 0.6))),
));
// commands.spawn((
// ));
}