diff options
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 164 |
1 files changed, 88 insertions, 76 deletions
diff --git a/src/main.rs b/src/main.rs index 8710a21..4ede773 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ use std::error::Error; -use std::fs::read_to_string; use std::path::Path; +use engine::asset::Assets; use engine::camera::fly::{ Extension as FlyCameraExtension, Fly as FlyCamera, @@ -9,31 +9,35 @@ use engine::camera::fly::{ }; use engine::camera::{Active as ActiveCamera, Camera}; use engine::color::Color; -use engine::data_types::dimens::Dimens; +use engine::data_types::dimens::Dimens3; +use engine::ecs::actions::Actions; +use engine::ecs::event::component::Added; +use engine::ecs::pair::Pair; +use engine::ecs::phase::START as START_PHASE; use engine::ecs::sole::Single; -use engine::event::Start as StartEvent; -use engine::file_format::wavefront::mtl::parse as parse_mtl; -use engine::file_format::wavefront::obj::parse as parse_obj; +use engine::ecs::system::observer::Observe; use engine::input::Extension as InputExtension; use engine::lighting::{AttenuationParams, GlobalLight, PointLight}; -use engine::material::{Builder as MaterialBuilder, Flags as MaterialFlags}; +use engine::material::{Flags as MaterialFlags, Material}; +use engine::mesh::cube::{ + create as cube_mesh_create, + CreationSpec as CubeMeshCreationSpec, +}; +use engine::model::{Data as ModelData, Model}; use engine::renderer::opengl::Extension as OpenglRendererExtension; -use engine::shader::Program as ShaderProgram; -use engine::transform::Position; +use engine::renderer::GraphicsProperties; +use engine::transform::WorldPosition; use engine::vector::Vec3; -use engine::window::{ - Builder as WindowBuilder, - CreationHint as WindowCreationHint, - CreationHintValue as WindowCreationHintValue, - CursorMode, - Extension as WindowExtension, +use engine::windowing::window::{ + CreationAttributes as WindowCreationAttributes, + CursorGrabMode as WindowCursorGrabMode, Window, }; use engine::Engine; -use tracing::Level; -use tracing_subscriber::FmtSubscriber; - -const WINDOW_SIZE: Dimens<u32> = Dimens { width: 1920, height: 1080 }; +use tracing::level_filters::LevelFilter; +use tracing_subscriber::layer::SubscriberExt; +use tracing_subscriber::util::SubscriberInitExt; +use tracing_subscriber::EnvFilter; const YELLOW: Color<f32> = Color { red: 0.988235294118, @@ -45,57 +49,20 @@ const RESOURCE_DIR: &str = "res"; fn main() -> Result<(), Box<dyn Error>> { - let subscriber = FmtSubscriber::builder() - .with_max_level(Level::TRACE) - .finish(); - - tracing::subscriber::set_global_default(subscriber)?; + tracing_subscriber::registry() + .with(tracing_subscriber::fmt::layer()) + .with( + EnvFilter::builder() + .with_default_directive(LevelFilter::DEBUG.into()) + .from_env()?, + ) + .init(); let mut engine = Engine::new(); - let teapot_obj = - parse_obj(&read_to_string(Path::new(RESOURCE_DIR).join("teapot.obj"))?)?; - - let teapot_mat_name = teapot_obj - .faces - .first() - .and_then(|face| face.material_name.as_ref()); - - let teapot_mats = teapot_obj.read_and_parse_material_libs(parse_mtl)?; - - let teapot_mat = teapot_mats - .into_iter() - .find(|mat| Some(&mat.name) == teapot_mat_name) - .ok_or("Teapot material was not found")?; - - engine.spawn(( - teapot_obj.to_mesh()?, - teapot_mat.material, - Position::from(Vec3 { x: 1.6, y: 0.0, z: 0.0 }), - ShaderProgram::new()?, - )); - - engine.spawn(( - PointLight::builder() - .position(Vec3 { x: -6.0, y: 3.0, z: 3.0 }) - .diffuse(YELLOW) - .attenuation_params(AttenuationParams { - linear: 0.045, - quadratic: 0.0075, - ..Default::default() - }) - .build(), - Position::from(Vec3 { x: -6.0, y: 3.0, z: 3.0 }), - parse_obj(&read_to_string(Path::new(RESOURCE_DIR).join("cube.obj"))?)? - .to_mesh()?, - MaterialBuilder::new().ambient(YELLOW * 5.0).build(), - ShaderProgram::new()?, - MaterialFlags::builder().use_ambient_color(true).build(), - )); - engine.spawn(( Camera::default(), - Position { + WorldPosition { position: Vec3 { x: 0.0, y: 0.0, z: 3.0 }, }, ActiveCamera, @@ -104,18 +71,13 @@ fn main() -> Result<(), Box<dyn Error>> engine.add_sole(GlobalLight::default())?; - engine.register_system(StartEvent, prepare_window); + engine.register_system(*START_PHASE, init); - engine.add_extension(OpenglRendererExtension::default()); + engine.register_observer(configure_window_on_added); - engine.add_extension( - WindowExtension::new(WindowBuilder::default().creation_hint( - WindowCreationHint::Samples, - WindowCreationHintValue::Number(8), - )) - .window_title("Game") - .window_size(WINDOW_SIZE), - ); + engine.add_extension(engine::windowing::Extension::default()); + + engine.add_extension(OpenglRendererExtension::default()); engine.add_extension(FlyCameraExtension(FlyCameraOptions { mouse_sensitivity: 0.2, @@ -123,12 +85,62 @@ fn main() -> Result<(), Box<dyn Error>> engine.add_extension(InputExtension::default()); + engine.spawn(( + WindowCreationAttributes::default().with_title("Game"), + GraphicsProperties::builder().debug(true).build(), + )); + engine.start(); Ok(()) } -fn prepare_window(window: Single<Window>) +fn configure_window_on_added(observe: Observe<Pair<Added, Window>>) { - window.set_cursor_mode(CursorMode::Disabled).unwrap(); + for evt_match in &observe { + let mut window = evt_match.get_added_comp_mut(); + + window.cursor_visible = false; + window.cursor_grab_mode = WindowCursorGrabMode::Locked; + + window.set_changed(); + } +} + +fn init(mut assets: Single<Assets>, mut actions: Actions) +{ + actions.spawn(( + PointLight::builder() + .diffuse(YELLOW) + .attenuation_params(AttenuationParams { + linear: 0.045, + quadratic: 0.0075, + ..Default::default() + }) + .build(), + WorldPosition::from(Vec3 { x: -6.0, y: 3.0, z: 3.0 }), + Model::new( + assets.store_with_name( + "light_cube", + ModelData::builder() + .mesh(cube_mesh_create( + CubeMeshCreationSpec::builder() + .dimens(Dimens3::from(2.0)) + .build(), + |face_verts, _, _| face_verts, + )) + .material( + "surface", + Material::builder().ambient(YELLOW * 5.0).build(), + ) + .build(), + ), + ), + MaterialFlags::builder().use_ambient_color(true).build(), + )); + + actions.spawn(( + Model::new(assets.load::<ModelData>(Path::new(RESOURCE_DIR).join("teapot.obj"))), + WorldPosition::from(Vec3 { x: 1.6, y: 0.0, z: 0.0 }), + )); } |