stevenarella/src/render/shaders.rs

111 lines
2.6 KiB
Rust

// Copyright 2015 Matthew Collins
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use render::glsl;
use gl;
pub fn add_shaders(reg: &mut glsl::Registry) {
reg.register("lookup_texture",
include_str!("shaders/lookup_texture.glsl"));
reg.register("get_light", include_str!("shaders/get_light.glsl"));
reg.register("ui_vertex", include_str!("shaders/ui_vertex.glsl"));
reg.register("ui_frag", include_str!("shaders/ui_frag.glsl"));
}
#[macro_export]
macro_rules! init_shader {
(
Program $name:ident {
vert = $vert:expr,
frag = $frag:expr,
attribute = {
$(
$field:ident => $glname:expr,
)*
},
uniform = {
$(
$ufield:ident => $uglname:expr,
)*
},
}
) => (
struct $name {
program: gl::Program,
$(
$field: gl::Attribute,
)+
$(
$ufield: gl::Uniform,
)+
}
impl $name {
pub fn new(reg: &glsl::Registry) -> $name {
let v = reg.get($vert);
let f = reg.get($frag);
let shader = shaders::create_program(&v, &f);
$name {
$(
$field: shader.attribute_location($glname),
)+
$(
$ufield: shader.uniform_location($uglname),
)+
program: shader,
}
}
}
)
}
pub fn create_program(vertex: &str, fragment: &str) -> gl::Program {
let program = gl::Program::new();
let v = gl::Shader::new(gl::VERTEX_SHADER);
v.set_source(vertex);
v.compile();
if v.get_parameter(gl::COMPILE_STATUS) == 0 {
println!("Src: {}", vertex);
panic!("Shader error: {}", v.get_info_log());
} else {
let log = v.get_info_log();
if !log.is_empty() {
println!("{}", log);
}
}
let f = gl::Shader::new(gl::FRAGMENT_SHADER);
f.set_source(fragment);
f.compile();
if f.get_parameter(gl::COMPILE_STATUS) == 0 {
println!("Src: {}", fragment);
panic!("Shader error: {}", f.get_info_log());
} else {
let log = f.get_info_log();
if !log.is_empty() {
println!("{}", log);
}
}
program.attach_shader(v);
program.attach_shader(f);
program.link();
program.use_program();
program
}