LD45/src/shaders.rs

49 lines
1.3 KiB
Rust

use crate::{
agnostic_interface::raylib_impl::RaylibShader,
faux_quicksilver::{Transform, Vector},
};
use std::ffi::CStr;
extern "C" {
pub fn glVertexAttrib2f(index: ::std::os::raw::c_uint, x: f32, y: f32);
}
extern "C" {
pub fn glVertexAttrib3f(index: ::std::os::raw::c_uint, x: f32, y: f32, z: f32);
}
#[allow(dead_code)]
extern "C" {
pub fn glVertexAttrib4f(index: ::std::os::raw::c_uint, x: f32, y: f32, z: f32, w: f32);
}
extern "C" {
pub fn glGetAttribLocation(
program: ::std::os::raw::c_uint,
name: *const ::std::os::raw::c_char,
) -> ::std::os::raw::c_int;
}
pub fn get_attrib_location(raylib_shader: &RaylibShader, name: &CStr) -> ::std::os::raw::c_uint {
unsafe {
glGetAttribLocation(raylib_shader.get_shader_id(), name.as_ptr()) as ::std::os::raw::c_uint
}
}
pub fn set_transform_3f(index: ::std::os::raw::c_uint, transform: Transform) {
// OpenGL stores matrix indices in column major order.
for (i, idx) in (index..(index + 3)).enumerate() {
unsafe {
glVertexAttrib3f(
idx,
transform.mat[i],
transform.mat[3 + i],
transform.mat[6 + i],
);
}
}
}
pub fn set_attr_2f(index: ::std::os::raw::c_uint, origin: Vector) {
unsafe {
glVertexAttrib2f(index, origin.x, origin.y);
}
}