diff options
author | HampusM <hampus@hampusmat.com> | 2025-06-03 14:10:31 +0200 |
---|---|---|
committer | HampusM <hampus@hampusmat.com> | 2025-06-03 14:10:31 +0200 |
commit | 9023f12f74f5ec8836374383fd5c347612c5d42f (patch) | |
tree | 6e21dce29b884b683916d907c3c3bebb31887a2d | |
parent | a109ac00e67129ddb358b6416a3241f22a441ad9 (diff) |
refactor: use asset management
-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 }), + )); } |