blob: d1ac85977074d13a1106d2dfd41c935ec304801b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
use crate::renderer::Renderable;
use crate::shader::{Kind as ShaderKind, Program as ShaderProgram, Shader};
#[derive(Debug)]
pub struct Object
{
renderable: Renderable,
}
impl Object
{
/// Returns a new `Object`.
///
/// # Errors
/// Will return `Err` if shader creation fails or if shader program linking fails.
pub fn new(vertices: &[f32]) -> Result<Self, Error>
{
let vertex_shader = Shader::new(ShaderKind::Vertex);
vertex_shader
.set_source(include_str!("../vertex.glsl"))
.map_err(Error::CreateVertexShaderFailed)?;
vertex_shader
.compile()
.map_err(Error::CreateVertexShaderFailed)?;
let fragment_shader = Shader::new(ShaderKind::Fragment);
fragment_shader
.set_source(include_str!("../fragment.glsl"))
.map_err(Error::CreateFragmentShaderFailed)?;
fragment_shader
.compile()
.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 renderable = Renderable::new(shader_program, vertices);
Ok(Self { renderable })
}
pub(crate) fn renderable(&self) -> &Renderable
{
&self.renderable
}
}
/// Object error
#[derive(Debug, thiserror::Error)]
pub enum Error
{
#[error("Failed to create vertex shader")]
CreateVertexShaderFailed(#[source] crate::shader::Error),
#[error("Failed to create fragment shader")]
CreateFragmentShaderFailed(#[source] crate::shader::Error),
#[error("Failed to link shader program")]
LinkShaderProgramFailed(#[source] crate::shader::Error),
}
|