summaryrefslogtreecommitdiff
path: root/engine/src/object.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/object.rs')
-rw-r--r--engine/src/object.rs116
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,