diff options
Diffstat (limited to 'engine/src/object.rs')
-rw-r--r-- | engine/src/object.rs | 229 |
1 files changed, 0 insertions, 229 deletions
diff --git a/engine/src/object.rs b/engine/src/object.rs deleted file mode 100644 index 0fd049c..0000000 --- a/engine/src/object.rs +++ /dev/null @@ -1,229 +0,0 @@ -use std::collections::HashMap; -use std::path::Path; - -use crate::material::Material; -use crate::mesh::Mesh; -use crate::shader::{ - Error as ShaderError, - Kind as ShaderKind, - Program as ShaderProgram, - Shader, -}; -use crate::texture::{Id as TextureId, Texture}; -use crate::transform::Transform; -use crate::vector::Vec3; -use crate::vertex::Vertex; - -const VERTEX_SHADER_FILE: &str = "vertex.glsl"; -const FRAGMENT_SHADER_FILE: &str = "fragment.glsl"; - -const SHADER_DIR: &str = "engine"; - -#[derive(Debug)] -pub struct Object -{ - id: Id, - mesh: Mesh, - shader: ShaderProgram, - transform: Transform, - textures: HashMap<TextureId, Texture>, - material: Material, -} - -impl Object -{ - /// Returns the object ID. - #[must_use] - pub fn id(&self) -> Id - { - self.id - } - - #[must_use] - pub fn position(&self) -> &Vec3<f32> - { - self.transform.position() - } - - pub fn translate(&mut self, translation: Vec3<f32>) - { - self.transform - .set_position(self.transform.position().clone() + translation); - } - - pub fn scale(&mut self, scaling: Vec3<f32>) - { - self.transform.set_scale(scaling); - } - - pub fn textures(&self) -> impl Iterator<Item = (&TextureId, &Texture)> - { - self.textures.iter() - } - - #[must_use] - pub fn material(&self) -> &Material - { - &self.material - } - - #[must_use] - pub fn mesh(&self) -> &Mesh - { - &self.mesh - } - - #[must_use] - pub fn shader(&self) -> &ShaderProgram - { - &self.shader - } - - pub(crate) fn transform(&self) -> &Transform - { - &self.transform - } -} - -/// Object builder. -#[derive(Debug)] -pub struct Builder -{ - vertices: Vec<Vertex>, - indices: Option<Vec<u32>>, - textures: HashMap<TextureId, Texture>, - material: Option<Material>, -} - -impl Builder -{ - /// Returns a new [`Object`] builder. - #[must_use] - pub fn new() -> Self - { - Self { - vertices: Vec::new(), - indices: None, - textures: HashMap::new(), - material: None, - } - } - - #[must_use] - pub fn vertices(mut self, vertices: impl IntoIterator<Item = Vertex>) -> Self - { - self.vertices = vertices.into_iter().collect(); - - self - } - - #[must_use] - pub fn indices(mut self, indices: impl IntoIterator<Item = u32>) -> Self - { - self.indices = Some(indices.into_iter().collect()); - - self - } - - #[must_use] - pub fn texture(mut self, id: TextureId, texture: Texture) -> Self - { - self.textures.insert(id, texture); - - self - } - - #[must_use] - pub fn textures<Textures>(mut self, textures: Textures) -> Self - where - Textures: IntoIterator<Item = (TextureId, Texture)>, - { - self.textures.extend(textures); - - self - } - - #[must_use] - pub fn material(mut self, material: Material) -> Self - { - self.material = Some(material); - - self - } - - /// Builds a new [`Object`]. - /// - /// # Errors - /// Will return `Err` if: - /// - Creating shaders fails - /// - Linking the shader program fails - pub fn build(self, id: Id) -> Result<Object, Error> - { - 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); - - let transform = Transform::new(); - - Ok(Object { - id, - mesh, - shader: shader_program, - transform, - textures: self.textures, - material: self.material.ok_or(Error::NoMaterial)?, - }) - } -} - -impl Default for Builder -{ - fn default() -> Self - { - Self::new() - } -} - -/// Object error -#[derive(Debug, thiserror::Error)] -pub enum Error -{ - #[error(transparent)] - ShaderError(#[from] ShaderError), - - #[error("Object builder has no material")] - NoMaterial, -} - -/// Object ID. -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct Id -{ - id: u16, -} - -impl Id -{ - /// Returns a new object ID. - #[must_use] - pub fn new(id: u16) -> Self - { - Self { id } - } -} |