summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs92
1 files changed, 56 insertions, 36 deletions
diff --git a/src/main.rs b/src/main.rs
index d5154ae..3595e22 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,6 +1,7 @@
use std::error::Error;
use std::path::Path;
+use engine::Engine;
use engine::asset::Assets;
use engine::camera::fly::{
Extension as FlyCameraExtension,
@@ -9,34 +10,34 @@ use engine::camera::fly::{
};
use engine::camera::{Active as ActiveCamera, Camera};
use engine::color::Color;
-use engine::data_types::dimens::{Dimens, Dimens3};
+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::ecs::system::observer::Observe;
use engine::input::Extension as InputExtension;
use engine::lighting::{AttenuationParams, GlobalLight, PointLight};
use engine::material::{Flags as MaterialFlags, Material};
use engine::mesh::cube::{
- create as cube_mesh_create,
CreationSpec as CubeMeshCreationSpec,
+ create as cube_mesh_create,
};
-use engine::model::{Data as ModelData, Model};
+use engine::model::{Materials as ModelMaterials, Model, Spec as ModelSpec};
+use engine::renderer::GraphicsProperties;
use engine::renderer::opengl::Extension as OpenglRendererExtension;
use engine::transform::WorldPosition;
use engine::vector::Vec3;
-use engine::window::{
- Builder as WindowBuilder,
- CursorMode,
- Extension as WindowExtension,
+use engine::windowing::window::{
+ CreationAttributes as WindowCreationAttributes,
+ CursorGrabMode as WindowCursorGrabMode,
Window,
};
-use engine::Engine;
use tracing::level_filters::LevelFilter;
+use tracing_subscriber::EnvFilter;
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::util::SubscriberInitExt;
-use tracing_subscriber::EnvFilter;
-
-const WINDOW_SIZE: Dimens<u32> = Dimens { width: 1920, height: 1080 };
const YELLOW: Color<f32> = Color {
red: 0.988235294118,
@@ -72,13 +73,11 @@ fn main() -> Result<(), Box<dyn Error>>
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().multisampling_sample_count(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,
@@ -86,15 +85,30 @@ 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 init(window: Single<Window>, mut assets: Single<Assets>, mut actions: Actions)
+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)
@@ -105,28 +119,34 @@ fn init(window: Single<Window>, mut assets: Single<Assets>, mut actions: Actions
})
.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",
+ Model::new(assets.store_with_name_with("light_cube", |assets| {
+ ModelSpec::builder()
+ .mesh(
+ assets.store_with_name(
+ "light_cube_mesh",
+ cube_mesh_create(
+ CubeMeshCreationSpec::builder()
+ .dimens(Dimens3::from(2.0))
+ .build(),
+ |face_verts, _, _| face_verts,
+ ),
+ ),
+ )
+ .materials(ModelMaterials::direct([(
+ "surface",
+ assets.store_with_name(
+ "light_cube_surface_mat",
Material::builder().ambient(YELLOW * 5.0).build(),
- )
- .build(),
- ),
- ),
+ ),
+ )]))
+ .material_name("surface")
+ .build()
+ })),
MaterialFlags::builder().use_ambient_color(true).build(),
));
actions.spawn((
- Model::new(assets.load::<ModelData>(Path::new(RESOURCE_DIR).join("teapot.obj"))),
+ Model::new(assets.load::<ModelSpec>(Path::new(RESOURCE_DIR).join("teapot.obj"))),
WorldPosition::from(Vec3 { x: 1.6, y: 0.0, z: 0.0 }),
));
}