mod custom_shader;
mod default_shaders;
mod uniform;
pub use custom_shader::*;
pub use default_shaders::*;
pub use uniform::*;
use crate::{ErrorMessage, PaddleResult};
use web_sys::{WebGlRenderingContext, WebGlShader};
pub fn new_vertex_shader(gl: &WebGlRenderingContext, text: &str) -> PaddleResult<WebGlShader> {
compile_shader(&gl, WebGlRenderingContext::VERTEX_SHADER, text)
}
pub fn new_fragment_shader(gl: &WebGlRenderingContext, text: &str) -> PaddleResult<WebGlShader> {
compile_shader(&gl, WebGlRenderingContext::FRAGMENT_SHADER, text)
}
fn compile_shader(
gl: &WebGlRenderingContext,
shader_type: u32,
source: &str,
) -> PaddleResult<WebGlShader> {
let shader = gl
.create_shader(shader_type)
.ok_or_else(|| ErrorMessage::technical("Unable to create shader object".to_owned()))?;
gl.shader_source(&shader, source);
gl.compile_shader(&shader);
if gl
.get_shader_parameter(&shader, WebGlRenderingContext::COMPILE_STATUS)
.as_bool()
.unwrap_or(false)
{
Ok(shader)
} else {
Err(ErrorMessage::technical(
gl.get_shader_info_log(&shader)
.unwrap_or_else(|| "Unknown error creating shader".to_owned()),
))
}
}