From 4b877079872248d3a4c17312b18599c6084e1e2d Mon Sep 17 00:00:00 2001 From: Irene Knapp Date: Sat, 8 Aug 2026 20:11:06 -0700 Subject: move the obj loader to a more logical place Force-Push: yes Change-Id: I0d506fa517daeacf63b52fdd5900f1bbee9c22b7 --- src/files/mod.rs | 3 +++ src/files/obj.rs | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/graphics/model.rs | 5 ++--- src/main.rs | 7 +++++-- src/model_loader.rs | 44 -------------------------------------------- 5 files changed, 54 insertions(+), 49 deletions(-) create mode 100644 src/files/mod.rs create mode 100644 src/files/obj.rs delete mode 100644 src/model_loader.rs diff --git a/src/files/mod.rs b/src/files/mod.rs new file mode 100644 index 0000000..8bc7539 --- /dev/null +++ b/src/files/mod.rs @@ -0,0 +1,3 @@ +#![deny(unsafe_code)] + +pub mod obj; diff --git a/src/files/obj.rs b/src/files/obj.rs new file mode 100644 index 0000000..c45ffbf --- /dev/null +++ b/src/files/obj.rs @@ -0,0 +1,44 @@ +#![forbid(unsafe_code)] +use crate::error::*; +use crate::linear_algebra::{ Vec2, Vec3 }; +use crate::shader_data::Vertex; + +use std::io::Cursor; + +use tobj::{ load_obj_buf, LoadOptions }; + + +pub fn load_obj() -> Result<(Vec>, Vec)> { + let obj = include_bytes!("../../models/teapot.obj"); + + let load_options = LoadOptions { + single_index: true, + triangulate: true, + ..Default::default() + }; + let (models, materials) = load_obj_buf(&mut Cursor::new(obj), &load_options, + |_| Ok(Default::default()))?; + + let _ = materials?; + + let mut vertices = Vec::new(); + let mut indices = Vec::new(); + + for model in models { + for index in 0 .. model.mesh.positions.len() / 3 { + vertices.push(Vertex::new(Vec3::new(model.mesh.positions[index*3], + model.mesh.positions[index*3 + 1], + model.mesh.positions[index*3 + 2]), + Vec3::new(1.0, 1.0, 1.0), + Vec2::new(model.mesh.texcoords[index*2], + model.mesh.texcoords[index*2 + 1]))) + } + + for index in model.mesh.indices { + indices.push(index); + } + } + + Ok((vertices, indices)) +} + diff --git a/src/graphics/model.rs b/src/graphics/model.rs index bda064c..01e8731 100644 --- a/src/graphics/model.rs +++ b/src/graphics/model.rs @@ -5,7 +5,6 @@ use crate::graphics::render_state::RenderState; use crate::graphics::util::init_buffer; use crate::graphics::window_dressing::WindowDressing; use crate::linear_algebra::{ Vec3, Vec4, Transformation }; -use crate::model_loader::load_model; use crate::shader_data::{ Vertex, VertexPushBlock }; use std::f32::consts::{ TAU }; @@ -26,7 +25,8 @@ pub struct Model { impl Model { - pub fn new(permanent: &PermanentGraphicsState, + pub fn new(vertices: Vec>, indices: Vec, + permanent: &PermanentGraphicsState, window_dressing: &WindowDressing) -> Result { @@ -35,7 +35,6 @@ impl Model { let graphics_queue = &permanent.graphics_queue; let transient_command_pool = &window_dressing.transient_command_pool; - let (vertices, indices) = load_model()?; let index_count = indices.len(); let (vertex_buffer, vertex_buffer_memory) diff --git a/src/main.rs b/src/main.rs index 6382f51..9fb89bc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,6 +10,7 @@ use crate::graphics::window_dressing::{ WindowDressing, N_SIMULTANEOUS_FRAMES }; use crate::linear_algebra::{ Vec3, Mat4, Transformation }; +use crate::files::obj::load_obj; use crate::shader_data::UniformBlock; use std::cell::RefCell; @@ -25,9 +26,9 @@ use winit::event_loop::{ ActiveEventLoop, EventLoop }; use winit::window::WindowId; mod error; +mod files; mod graphics; mod linear_algebra; -mod model_loader; mod shader_data; @@ -73,7 +74,9 @@ impl Surreality { enable_anisotropy)?; let mut render_state = RenderState::new(&permanent, &for_reinit, &window_dressing)?; - render_state.set_model(Model::new(&permanent, &window_dressing)?); + let (vertices, indices) = load_obj()?; + render_state.set_model(Model::new(vertices, indices, + &permanent, &window_dressing)?); *self.window_dressing.get_mut() = Some(window_dressing); *self.render_state.get_mut() = Some(render_state); diff --git a/src/model_loader.rs b/src/model_loader.rs deleted file mode 100644 index fea5ab5..0000000 --- a/src/model_loader.rs +++ /dev/null @@ -1,44 +0,0 @@ -#![forbid(unsafe_code)] -use crate::error::*; -use crate::linear_algebra::{ Vec2, Vec3 }; -use crate::shader_data::Vertex; - -use std::io::Cursor; - -use tobj::{ load_obj_buf, LoadOptions }; - - -pub fn load_model() -> Result<(Vec>, Vec)> { - let obj = include_bytes!("../models/teapot.obj"); - - let load_options = LoadOptions { - single_index: true, - triangulate: true, - ..Default::default() - }; - let (models, materials) = load_obj_buf(&mut Cursor::new(obj), &load_options, - |_| Ok(Default::default()))?; - - let _ = materials?; - - let mut vertices = Vec::new(); - let mut indices = Vec::new(); - - for model in models { - for index in 0 .. model.mesh.positions.len() / 3 { - vertices.push(Vertex::new(Vec3::new(model.mesh.positions[index*3], - model.mesh.positions[index*3 + 1], - model.mesh.positions[index*3 + 2]), - Vec3::new(1.0, 1.0, 1.0), - Vec2::new(model.mesh.texcoords[index*2], - model.mesh.texcoords[index*2 + 1]))) - } - - for index in model.mesh.indices { - indices.push(index); - } - } - - Ok((vertices, indices)) -} - -- cgit 1.4.1