diff options
Diffstat (limited to 'engine/src/object.rs')
-rw-r--r-- | engine/src/object.rs | 116 |
1 files changed, 23 insertions, 93 deletions
diff --git a/engine/src/object.rs b/engine/src/object.rs index 5391cf5..0fd049c 100644 --- a/engine/src/object.rs +++ b/engine/src/object.rs @@ -1,27 +1,24 @@ use std::collections::HashMap; -use std::fs::read_to_string; -use std::io::Error as IoError; -use std::path::{Path, PathBuf}; +use std::path::Path; use crate::material::Material; use crate::mesh::Mesh; -use crate::opengl::shader::{ +use crate::shader::{ Error as ShaderError, Kind as ShaderKind, Program as ShaderProgram, Shader, }; -use crate::shader_preprocessor::{Error as ShaderPreprocessorError, ShaderPreprocessor}; use crate::texture::{Id as TextureId, Texture}; use crate::transform::Transform; use crate::vector::Vec3; use crate::vertex::Vertex; -const SHADER_DIR: &str = "engine"; - const VERTEX_SHADER_FILE: &str = "vertex.glsl"; const FRAGMENT_SHADER_FILE: &str = "fragment.glsl"; +const SHADER_DIR: &str = "engine"; + #[derive(Debug)] pub struct Object { @@ -162,58 +159,23 @@ impl Builder /// - Linking the shader program fails pub fn build(self, id: Id) -> Result<Object, Error> { - let vertex_shader_file = Path::new(SHADER_DIR).join(VERTEX_SHADER_FILE); - - let fragment_shader_file = Path::new(SHADER_DIR).join(FRAGMENT_SHADER_FILE); - - let vertex_shader_content = - read_to_string(&vertex_shader_file).map_err(|err| { - Error::ReadShaderFailed { - source: err, - shader_file: vertex_shader_file.clone(), - } - })?; - - let fragment_shader_content = - read_to_string(&fragment_shader_file).map_err(|err| { - Error::ReadShaderFailed { - source: err, - shader_file: fragment_shader_file.clone(), - } - })?; - - let shader_preprocessor = ShaderPreprocessor::new(PathBuf::from(SHADER_DIR)); - - let vertex_shader_content_preprocessed = shader_preprocessor - .preprocess(vertex_shader_content, &vertex_shader_file) - .map_err(|err| Error::PreprocessShaderFailed { - source: err, - shader_file: vertex_shader_file, - })?; - - let frag_shader_content_preprocessed = shader_preprocessor - .preprocess(fragment_shader_content, &fragment_shader_file) - .map_err(|err| Error::PreprocessShaderFailed { - source: err, - shader_file: fragment_shader_file, - })?; - - let vertex_shader = - Self::create_shader(ShaderKind::Vertex, &vertex_shader_content_preprocessed) - .map_err(Error::CreateVertexShaderFailed)?; - - let fragment_shader = - Self::create_shader(ShaderKind::Fragment, &frag_shader_content_preprocessed) - .map_err(Error::CreateFragmentShaderFailed)?; - - let shader_program = ShaderProgram::new(); - - shader_program.attach(&vertex_shader); - shader_program.attach(&fragment_shader); - - shader_program - .link() - .map_err(Error::LinkShaderProgramFailed)?; + let mut shader_program = ShaderProgram::new(); + + shader_program.push_shader( + Shader::read_shader_file( + ShaderKind::Vertex, + &Path::new(SHADER_DIR).join(VERTEX_SHADER_FILE), + )? + .preprocess()?, + ); + + shader_program.push_shader( + Shader::read_shader_file( + ShaderKind::Fragment, + &Path::new(SHADER_DIR).join(FRAGMENT_SHADER_FILE), + )? + .preprocess()?, + ); let mesh = Mesh::new(self.vertices, self.indices); @@ -228,16 +190,6 @@ impl Builder material: self.material.ok_or(Error::NoMaterial)?, }) } - - fn create_shader(kind: ShaderKind, source: &str) -> Result<Shader, ShaderError> - { - let shader = Shader::new(kind); - - shader.set_source(source)?; - shader.compile()?; - - Ok(shader) - } } impl Default for Builder @@ -252,30 +204,8 @@ impl Default for Builder #[derive(Debug, thiserror::Error)] pub enum Error { - #[error("Failed to create vertex shader")] - CreateVertexShaderFailed(#[source] ShaderError), - - #[error("Failed to create fragment shader")] - CreateFragmentShaderFailed(#[source] ShaderError), - - #[error("Failed to link shader program")] - LinkShaderProgramFailed(#[source] ShaderError), - - #[error("Failed to read shader {}", shader_file.display())] - ReadShaderFailed - { - #[source] - source: IoError, - shader_file: PathBuf, - }, - - #[error("Failed to preprocess shader {}", shader_file.display())] - PreprocessShaderFailed - { - #[source] - source: ShaderPreprocessorError, - shader_file: PathBuf, - }, + #[error(transparent)] + ShaderError(#[from] ShaderError), #[error("Object builder has no material")] NoMaterial, |