102 lines
3.1 KiB
Rust
102 lines
3.1 KiB
Rust
use glow::*;
|
|
use iced_glow::glow;
|
|
use iced_glow::Color;
|
|
|
|
pub struct Scene {
|
|
program: glow::Program,
|
|
vertex_array: glow::VertexArray,
|
|
}
|
|
|
|
impl Scene {
|
|
pub fn new(gl: &glow::Context, shader_version: &str) -> Self {
|
|
unsafe {
|
|
let vertex_array = gl
|
|
.create_vertex_array()
|
|
.expect("Cannot create vertex array");
|
|
gl.bind_vertex_array(Some(vertex_array));
|
|
|
|
let program = gl.create_program().expect("Cannot create program");
|
|
|
|
let (vertex_shader_source, fragment_shader_source) = (
|
|
r#"const vec2 verts[3] = vec2[3](
|
|
vec2(0.5f, 1.0f),
|
|
vec2(0.0f, 0.0f),
|
|
vec2(1.0f, 0.0f)
|
|
);
|
|
out vec2 vert;
|
|
void main() {
|
|
vert = verts[gl_VertexID];
|
|
gl_Position = vec4(vert - 0.5, 0.0, 1.0);
|
|
}"#,
|
|
r#"precision highp float;
|
|
in vec2 vert;
|
|
out vec4 color;
|
|
void main() {
|
|
color = vec4(vert, 0.5, 1.0);
|
|
}"#,
|
|
);
|
|
|
|
let shader_sources = [
|
|
(glow::VERTEX_SHADER, vertex_shader_source),
|
|
(glow::FRAGMENT_SHADER, fragment_shader_source),
|
|
];
|
|
|
|
let mut shaders = Vec::with_capacity(shader_sources.len());
|
|
|
|
for (shader_type, shader_source) in shader_sources.iter() {
|
|
let shader = gl
|
|
.create_shader(*shader_type)
|
|
.expect("Cannot create shader");
|
|
gl.shader_source(
|
|
shader,
|
|
&format!("{shader_version}\n{shader_source}"),
|
|
);
|
|
gl.compile_shader(shader);
|
|
if !gl.get_shader_compile_status(shader) {
|
|
panic!("{}", gl.get_shader_info_log(shader));
|
|
}
|
|
gl.attach_shader(program, shader);
|
|
shaders.push(shader);
|
|
}
|
|
|
|
gl.link_program(program);
|
|
if !gl.get_program_link_status(program) {
|
|
panic!("{}", gl.get_program_info_log(program));
|
|
}
|
|
|
|
for shader in shaders {
|
|
gl.detach_shader(program, shader);
|
|
gl.delete_shader(shader);
|
|
}
|
|
|
|
gl.use_program(Some(program));
|
|
Self {
|
|
program,
|
|
vertex_array,
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn clear(&self, gl: &glow::Context, background_color: Color) {
|
|
let [r, g, b, a] = background_color.into_linear();
|
|
unsafe {
|
|
gl.clear_color(r, g, b, a);
|
|
gl.clear(glow::COLOR_BUFFER_BIT);
|
|
}
|
|
}
|
|
|
|
pub fn draw(&self, gl: &glow::Context) {
|
|
unsafe {
|
|
gl.bind_vertex_array(Some(self.vertex_array));
|
|
gl.use_program(Some(self.program));
|
|
gl.draw_arrays(glow::TRIANGLES, 0, 3);
|
|
}
|
|
}
|
|
|
|
pub fn cleanup(&self, gl: &glow::Context) {
|
|
unsafe {
|
|
gl.delete_program(self.program);
|
|
gl.delete_vertex_array(self.vertex_array);
|
|
}
|
|
}
|
|
}
|