summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2025-06-03 14:10:31 +0200
committerHampusM <hampus@hampusmat.com>2025-06-03 14:10:31 +0200
commit9023f12f74f5ec8836374383fd5c347612c5d42f (patch)
tree6e21dce29b884b683916d907c3c3bebb31887a2d
parenta109ac00e67129ddb358b6416a3241f22a441ad9 (diff)
refactor: use asset management
-rw-r--r--src/main.rs123
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 }),
+ ));
}