summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs164
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 }),
+ ));
}