diff options
| -rw-r--r-- | src/main.rs | 123 | 
1 files changed, 42 insertions, 81 deletions
diff --git a/src/main.rs b/src/main.rs index c1ea1cd..d5154ae 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,20 +9,19 @@ 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::{Dimens, Dimens3}; +use engine::ecs::actions::Actions;  use engine::ecs::phase::START as START_PHASE;  use engine::ecs::sole::Single; -use engine::file_format::wavefront::mtl::parse as parse_mtl; -use engine::file_format::wavefront::obj::parse as parse_obj;  use engine::input::Extension as InputExtension;  use engine::lighting::{AttenuationParams, GlobalLight, PointLight}; -use engine::material::{Builder as MaterialBuilder, Flags as MaterialFlags, Material}; +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::texture::Texture;  use engine::transform::WorldPosition;  use engine::vector::Vec3;  use engine::window::{ @@ -60,79 +59,6 @@ fn main() -> Result<(), Box<dyn Error>>      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_named_mat = teapot_mats -        .into_iter() -        .find(|mat| Some(&mat.name) == teapot_mat_name) -        .ok_or("Teapot material was not found")?; - -    let mut teapot_mat_builder = Material::builder() -        .ambient(teapot_named_mat.ambient) -        .diffuse(teapot_named_mat.diffuse) -        .specular(teapot_named_mat.specular) -        .shininess(teapot_named_mat.shininess); - -    if let Some(ambient_map) = teapot_named_mat.ambient_map { -        let texture = Texture::open(&ambient_map.path).unwrap(); - -        teapot_mat_builder = teapot_mat_builder -            .ambient_map(texture.id()) -            .texture(texture); -    } - -    if let Some(diffuse_map) = teapot_named_mat.diffuse_map { -        let texture = Texture::open(&diffuse_map.path).unwrap(); - -        teapot_mat_builder = teapot_mat_builder -            .diffuse_map(texture.id()) -            .texture(texture); -    } - -    if let Some(specular_map) = teapot_named_mat.specular_map { -        let texture = Texture::open(&specular_map.path).unwrap(); - -        teapot_mat_builder = teapot_mat_builder -            .specular_map(texture.id()) -            .texture(texture); -    } - -    engine.spawn(( -        teapot_obj.to_mesh()?, -        teapot_mat_builder.build(), -        WorldPosition::from(Vec3 { x: 1.6, y: 0.0, z: 0.0 }), -    )); - -    engine.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 }), -        cube_mesh_create( -            CubeMeshCreationSpec::builder() -                .width(2.0) -                .height(2.0) -                .depth(2.0) -                .build(), -            |face_verts, _, _| face_verts, -        ), -        MaterialBuilder::new().ambient(YELLOW * 5.0).build(), -        MaterialFlags::builder().use_ambient_color(true).build(), -    )); -      engine.spawn((          Camera::default(),          WorldPosition { @@ -144,7 +70,7 @@ fn main() -> Result<(), Box<dyn Error>>      engine.add_sole(GlobalLight::default())?; -    engine.register_system(*START_PHASE, prepare_window); +    engine.register_system(*START_PHASE, init);      engine.add_extension(OpenglRendererExtension::default()); @@ -165,7 +91,42 @@ fn main() -> Result<(), Box<dyn Error>>      Ok(())  } -fn prepare_window(window: Single<Window>) +fn init(window: Single<Window>, mut assets: Single<Assets>, mut actions: Actions)  {      window.set_cursor_mode(CursorMode::Disabled).unwrap(); + +    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 }), +    ));  }  | 
