diff --git a/src/bin/pumpkin.rs b/src/bin/pumpkin.rs
index c877fbd..7326921 100644
--- a/src/bin/pumpkin.rs
+++ b/src/bin/pumpkin.rs
@@ -123,8 +123,8 @@ fn make_object_space_vec (inverse_model_mat: &Mat4, world_space_vec: &Vec3)
fn renderable_from_iqm_file
(filename: P) -> RenderableModel
where P: AsRef
{
- let data = load_small_file (filename, 1024 * 1024);
- let model = Model::from_slice (&data);
+ let data = load_small_file (filename, 1024 * 1024).unwrap ();
+ let model = Model::from_slice (&data).unwrap ();
RenderableModel::from_iqm (&model)
}
@@ -222,6 +222,7 @@ fn main () {
let mesh_pumpkin = renderable_from_iqm_file ("pumpking.iqm");
let mesh_sky = renderable_from_iqm_file ("sky-sphere.iqm");
let mesh_pitch = renderable_from_iqm_file ("pitch.iqm");
+ let mesh_arrow = renderable_from_iqm_file ("arrow.iqm");
let orange = color_from_255 ((210.0, 125.0, 44.0));
let green = color_from_255 ((52.0, 101.0, 36.0));
diff --git a/src/file.rs b/src/file.rs
index 157fc85..f622f7c 100644
--- a/src/file.rs
+++ b/src/file.rs
@@ -3,19 +3,32 @@ use std::fs::File;
use std::io::Read;
use std::path::Path;
-pub fn load_small_file (name: P, max_size: u64) -> Vec
+#[derive (Debug)]
+pub enum LoadFileErr {
+ FileTooBig,
+ Io (std::io::Error),
+}
+
+impl From for LoadFileErr {
+ fn from (e: std::io::Error) -> Self {
+ Self::Io (e)
+ }
+}
+
+pub fn load_small_file (name: P, max_size: u64)
+-> Result , LoadFileErr>
where P: AsRef
{
- let mut f = File::open (name).unwrap ();
- let len = f.metadata ().unwrap ().len ();
+ let mut f = File::open (name)?;
+ let len = f.metadata ()?.len ();
if len > max_size {
- panic! ("File is too big");
+ return Err (LoadFileErr::FileTooBig);
}
let mut data = vec! [0u8; len.try_into ().unwrap ()];
- f.read_exact (&mut data [..]).unwrap ();
+ f.read_exact (&mut data [..])?;
- data
+ Ok (data)
}
diff --git a/src/iqm.rs b/src/iqm.rs
index 8ccfb84..50a63e1 100644
--- a/src/iqm.rs
+++ b/src/iqm.rs
@@ -180,9 +180,19 @@ impl VertexArray {
}
}
+#[derive (Debug)]
+pub enum ModelLoadErr {
+ ParseHeaderFailed,
+ ParseMeshFailed (usize),
+ ParseVertexArrayFailed (usize),
+}
+
impl <'a> Model <'a> {
- pub fn from_slice (data: &'a [u8]) -> Model <'a> {
- let header = Header::from_slice (data).unwrap ().1;
+ pub fn from_slice (data: &'a [u8]) -> Result , ModelLoadErr> {
+ let header = match Header::from_slice (data) {
+ Ok ((_, h)) => h,
+ Err (_) => return Err (ModelLoadErr::ParseHeaderFailed),
+ };
let text = {
let offset: usize = header.fields [consts::OFS_TEXT].try_into ().unwrap ();
@@ -200,7 +210,12 @@ impl <'a> Model <'a> {
let offset = meshes_offset + i * mesh_size;
let mesh_slice = &data [offset..offset + mesh_size];
- meshes.push (Mesh::from_slice (mesh_slice).unwrap ().1);
+ let mesh = match Mesh::from_slice (mesh_slice) {
+ Ok ((_, m)) => m,
+ Err (_) => return Err (ModelLoadErr::ParseMeshFailed (i)),
+ };
+
+ meshes.push (mesh);
}
meshes
};
@@ -215,9 +230,10 @@ impl <'a> Model <'a> {
let offset = vertexarrays_offset + i * vertexarray_size;
let vertexarray_slice = &data [offset..offset + vertexarray_size];
- let vertexarray = VertexArray::from_slice (vertexarray_slice).unwrap ().1;
-
- //println! ("{:?}", vertexarray);
+ let vertexarray = match VertexArray::from_slice (vertexarray_slice) {
+ Ok ((_, va)) => va,
+ Err (_) => return Err (ModelLoadErr::ParseVertexArrayFailed (i)),
+ };
vertexarrays.push (vertexarray);
}
@@ -225,14 +241,14 @@ impl <'a> Model <'a> {
vertexarrays
};
- Model {
+ Ok (Model {
data,
header,
text,
meshes,
vertexarrays,
- }
+ })
}
pub fn get_vertex_slice (&self,
diff --git a/src/shader.rs b/src/shader.rs
index 2a3221f..0eaf51f 100644
--- a/src/shader.rs
+++ b/src/shader.rs
@@ -60,7 +60,7 @@ impl ShaderObject {
-> Result
where P: AsRef
{
- let src = crate::file::load_small_file (filename, 1024 * 1024);
+ let src = crate::file::load_small_file (filename, 1024 * 1024).unwrap ();
Self::from_source (shader_type, &src)
}
}