diff --git a/client/Cargo.toml b/client/Cargo.toml index ed77906..7b75abb 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -5,6 +5,7 @@ edition = "2024" description = "Horror-Game" repository = "https://github.com/eliasstepanik/horror-game" license = "MIT OR Apache-2.0" +build = "build.rs" [dependencies] @@ -19,4 +20,8 @@ egui_dock = "0.14.0" spacetimedb-sdk = "1.0" hex = "0.4" random_word = { version = "0.5.0", features = ["en"] } -rand = "0.8.5" \ No newline at end of file +rand = "0.8.5" +serde = { version = "1.0", features = ["derive"] } +toml = "0.8" + + diff --git a/client/Config.toml b/client/Config.toml new file mode 100644 index 0000000..287dc86 --- /dev/null +++ b/client/Config.toml @@ -0,0 +1,6 @@ +[server] +host = "http://100.85.241.101:3000" +database = "network-game" + +[movement] +mode = "fligt" \ No newline at end of file diff --git a/client/build.rs b/client/build.rs new file mode 100644 index 0000000..d940235 --- /dev/null +++ b/client/build.rs @@ -0,0 +1,10 @@ +use std::fs; +use std::path::Path; + +fn main() { + let out_dir = std::env::var("OUT_DIR").unwrap(); + let target_dir = Path::new(&out_dir).ancestors().nth(3).unwrap(); // gets target/debug or release + + fs::copy("config.toml", target_dir.join("config.toml")) + .expect("Failed to copy config.toml to target directory"); +} diff --git a/client/src/app.rs b/client/src/app.rs index 5542051..31874a2 100644 --- a/client/src/app.rs +++ b/client/src/app.rs @@ -24,12 +24,10 @@ impl Plugin for AppPlugin { fn build(&self, app: &mut App) { app.insert_resource(UiState::new()); app.insert_resource(InspectorVisible(true)); - - app.add_plugins(crate::plugins::camera::camera_plugin::CameraPlugin); app.add_plugins(crate::plugins::ui::ui_plugin::UiPlugin); app.add_plugins(crate::plugins::environment::environment_plugin::EnvironmentPlugin); app.add_plugins(crate::plugins::network::network_plugin::NetworkPlugin); - + app.add_plugins(crate::plugins::input::input_plugin::InputPlugin); app.add_systems(Update, (debug_gizmos, toggle_ui_system)); app.add_systems( diff --git a/client/src/config.rs b/client/src/config.rs new file mode 100644 index 0000000..f8c51ec --- /dev/null +++ b/client/src/config.rs @@ -0,0 +1,15 @@ +use bevy::prelude::Resource; +use serde::Deserialize; + +#[derive(Debug, Deserialize, Resource)] +pub struct Config { + pub server: ServerConfig, +} + + +#[derive(Debug, Deserialize)] +pub struct ServerConfig { + pub host: String, + pub database: String, + +} \ No newline at end of file diff --git a/client/src/helper/math.rs b/client/src/helper/math.rs new file mode 100644 index 0000000..423d52c --- /dev/null +++ b/client/src/helper/math.rs @@ -0,0 +1,12 @@ +pub trait RoundTo { + /// Rounds `self` to `decimals` places. + fn round_to(self, decimals: u32) -> f32; +} + +impl RoundTo for f32 { + #[inline] + fn round_to(self, decimals: u32) -> f32 { + let factor = 10f32.powi(decimals as i32); + (self * factor).round() / factor + } +} \ No newline at end of file diff --git a/client/src/helper/mod.rs b/client/src/helper/mod.rs index 8aa673e..ad27699 100644 --- a/client/src/helper/mod.rs +++ b/client/src/helper/mod.rs @@ -1,2 +1,4 @@ pub mod debug_gizmos; pub mod egui_dock; +pub mod vector_helper; +pub mod math; diff --git a/client/src/helper/vector_helper.rs b/client/src/helper/vector_helper.rs new file mode 100644 index 0000000..3ce8e5b --- /dev/null +++ b/client/src/helper/vector_helper.rs @@ -0,0 +1,30 @@ +use bevy::math::Vec3; +use bevy::prelude::{Quat, Transform}; +use rand::Rng; +use crate::helper::math::RoundTo; +use crate::module_bindings::DbTransform; + +pub(crate) fn random_vec3(min: f32, max: f32) -> Vec3 { + let mut rng = rand::thread_rng(); + Vec3::new( + rng.gen_range(min..max), + rng.gen_range(min..max), + rng.gen_range(min..max), + ) +} + +impl From for Transform { + fn from(db: DbTransform) -> Self { + Transform { + translation: Vec3::new(db.position.x, db.position.y, db.position.z), + rotation: //Quat::from_xyzw(0.0, 0.0, 0.0, 0.0), + Quat::from_xyzw( + db.rotation.x.round_to(3), + db.rotation.y.round_to(3), + db.rotation.z.round_to(3), + db.rotation.w.round_to(3), + ), + scale: Vec3::new(db.scale.x.round_to(3), db.scale.y.round_to(3), db.scale.z.round_to(3)), + } + } +} \ No newline at end of file diff --git a/client/src/main.rs b/client/src/main.rs index e32951f..a754167 100644 --- a/client/src/main.rs +++ b/client/src/main.rs @@ -2,7 +2,9 @@ mod app; mod helper; mod plugins; mod module_bindings; +mod config; +use std::fs; use crate::app::AppPlugin; use bevy::gizmos::{AppGizmoBuilder, GizmoPlugin}; use bevy::log::info; @@ -13,6 +15,8 @@ use bevy::DefaultPlugins; use bevy_egui::EguiPlugin; use bevy_inspector_egui::DefaultInspectorConfigPlugin; use bevy_window::{PresentMode, Window, WindowPlugin}; +use toml; +use crate::config::Config; const TITLE: &str = "horror-game"; const RESOLUTION: (f32, f32) = (1920f32, 1080f32); @@ -21,13 +25,27 @@ const DECORATIONS: bool = true; const TRANSPARENT: bool = true; const PRESENT_MODE: PresentMode = PresentMode::AutoVsync; + + fn main() { + let config_str = fs::read_to_string("Config.toml").expect("Failed to read config file"); + let config: Config = toml::from_str(&config_str).expect("Failed to parse config"); + + + + let mut app = App::new(); + + app.insert_resource(config); + register_platform_plugins(&mut app); app.add_plugins(AppPlugin); app.add_plugins(EguiPlugin); app.add_plugins(DefaultInspectorConfigPlugin); + + + /*app.add_plugins(GizmoPlugin);*/ app.run(); diff --git a/client/src/plugins/camera/camera_plugin.rs b/client/src/plugins/camera/camera_plugin.rs deleted file mode 100644 index ae6d357..0000000 --- a/client/src/plugins/camera/camera_plugin.rs +++ /dev/null @@ -1,16 +0,0 @@ -use bevy::a11y::AccessibilitySystem::Update; -use bevy::app::{App, Plugin, PreUpdate, Startup}; - -pub struct CameraPlugin; -impl Plugin for CameraPlugin { - fn build(&self, _app: &mut App) { - _app.add_systems( - Startup, - (crate::plugins::camera::systems::camera_system::setup), - ); - _app.add_systems( - PreUpdate, - (crate::plugins::camera::systems::camera_system::camera_controller_system), - ); - } -} diff --git a/client/src/plugins/camera/mod.rs b/client/src/plugins/camera/mod.rs deleted file mode 100644 index a75e95e..0000000 --- a/client/src/plugins/camera/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod camera_plugin; -pub mod systems; diff --git a/client/src/plugins/camera/systems/mod.rs b/client/src/plugins/camera/systems/mod.rs deleted file mode 100644 index 7265153..0000000 --- a/client/src/plugins/camera/systems/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod camera_system; diff --git a/client/src/plugins/environment/environment_plugin.rs b/client/src/plugins/environment/environment_plugin.rs index 0731a95..1b1aac5 100644 --- a/client/src/plugins/environment/environment_plugin.rs +++ b/client/src/plugins/environment/environment_plugin.rs @@ -1,6 +1,11 @@ -use bevy::app::{App, Plugin}; +use bevy::app::{App, Plugin, PreStartup, PreUpdate, Startup}; pub struct EnvironmentPlugin; impl Plugin for EnvironmentPlugin { fn build(&self, app: &mut App) { + + app.add_systems( + Startup, + (crate::plugins::environment::systems::camera_system::setup), + ); } } diff --git a/client/src/plugins/environment/systems/camera_system.rs b/client/src/plugins/environment/systems/camera_system.rs new file mode 100644 index 0000000..5fd17a5 --- /dev/null +++ b/client/src/plugins/environment/systems/camera_system.rs @@ -0,0 +1,53 @@ +use crate::helper::egui_dock::MainCamera; +use bevy::input::mouse::{MouseMotion, MouseWheel}; +use bevy::math::Vec3; +use bevy::prelude::*; +use bevy_render::camera::{Exposure, PhysicalCameraParameters, Projection}; +use bevy_window::CursorGrabMode; +use rand::Rng; +use random_word::Lang; +use crate::module_bindings::{set_name, set_position, spawn_entity, DbTransform, DbVector3, DbVector4}; +use crate::plugins::network::systems::database::DbConnectionResource; + +#[derive(Component)] +pub struct CameraController { + pub yaw: f32, + pub pitch: f32, + pub speed: f32, + pub sensitivity: f32, +} + +impl Default for CameraController { + fn default() -> Self { + Self { + yaw: 0.0, + pitch: 0.0, + speed: 10.0, + sensitivity: 0.1, + } + } +} + +pub fn setup(mut commands: Commands,) { + + + commands.spawn(( + Transform::from_xyz(0.0, 0.0, 10.0), // initial f32 + GlobalTransform::default(), + Camera3d::default(), + Projection::from(PerspectiveProjection { + near: 0.0001, + ..default() + }), + MainCamera, + CameraController::default(), + Exposure::from_physical_camera(PhysicalCameraParameters { + aperture_f_stops: 1.0, + shutter_speed_s: 1.0 / 125.0, + sensitivity_iso: 100.0, + sensor_height: 0.01866, + }), + + )); +} + diff --git a/client/src/plugins/environment/systems/mod.rs b/client/src/plugins/environment/systems/mod.rs index f271f28..65fe5a8 100644 --- a/client/src/plugins/environment/systems/mod.rs +++ b/client/src/plugins/environment/systems/mod.rs @@ -1 +1,2 @@ pub mod environment_system; +pub mod camera_system; diff --git a/client/src/plugins/input/input_plugin.rs b/client/src/plugins/input/input_plugin.rs new file mode 100644 index 0000000..771835c --- /dev/null +++ b/client/src/plugins/input/input_plugin.rs @@ -0,0 +1,20 @@ + +use bevy::app::{App, Plugin, PreUpdate, Startup}; +use bevy::prelude::{IntoSystemConfigs, Update}; + +pub struct InputPlugin; +impl Plugin for InputPlugin { + fn build(&self, _app: &mut App) { + _app.add_systems( + Update, + ( + crate::plugins::input::systems::console::console_system, + crate::plugins::input::systems::flight::flight_systems, + crate::plugins::input::systems::ui::ui_system, + crate::plugins::input::systems::network::network_system, + crate::plugins::input::systems::movement::movement_system, + ), + + ); + } +} diff --git a/client/src/plugins/input/mod.rs b/client/src/plugins/input/mod.rs new file mode 100644 index 0000000..a6ba29c --- /dev/null +++ b/client/src/plugins/input/mod.rs @@ -0,0 +1,2 @@ +pub mod systems; +pub mod input_plugin; \ No newline at end of file diff --git a/client/src/plugins/input/systems/console.rs b/client/src/plugins/input/systems/console.rs new file mode 100644 index 0000000..3db3c0d --- /dev/null +++ b/client/src/plugins/input/systems/console.rs @@ -0,0 +1,23 @@ +use bevy::app::AppExit; +use bevy::input::ButtonInput; +use bevy::input::mouse::{MouseMotion, MouseWheel}; +use bevy::prelude::{EventReader, EventWriter, KeyCode, Query, Res, ResMut, Time, Transform}; +use bevy_window::Window; +use crate::plugins::environment::systems::camera_system::CameraController; +use crate::plugins::network::systems::database::DbConnectionResource; + +pub fn console_system( + time: Res