feat: glsl simula text shaders
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
pub mod lines;
|
||||
pub mod model;
|
||||
pub mod shaders;
|
||||
pub mod text;
|
||||
|
||||
use self::{
|
||||
|
||||
54
src/nodes/drawable/shaders.rs
Normal file
54
src/nodes/drawable/shaders.rs
Normal file
@@ -0,0 +1,54 @@
|
||||
use std::{ffi::CString, mem::transmute};
|
||||
|
||||
use smithay::backend::renderer::gles::ffi::{Gles2, FRAGMENT_SHADER, VERTEX_SHADER};
|
||||
use stereokit::Shader;
|
||||
|
||||
struct FfiAssetHeader {
|
||||
asset_type: i32,
|
||||
asset_state: i32,
|
||||
id: u64,
|
||||
index: u64,
|
||||
refs: i32,
|
||||
}
|
||||
|
||||
struct FfiSkgShader {
|
||||
meta: *mut u8,
|
||||
vertex: u32,
|
||||
pixel: u32,
|
||||
program: u32,
|
||||
compute: u32,
|
||||
}
|
||||
|
||||
struct FfiShader {
|
||||
header: FfiAssetHeader,
|
||||
shader: FfiSkgShader,
|
||||
}
|
||||
|
||||
unsafe fn load_shader(c: &Gles2, source: &str, stage: u32) -> u32 {
|
||||
let shader = c.CreateShader(stage);
|
||||
let shader_source = CString::new(source).unwrap();
|
||||
c.ShaderSource(shader, 1, &shader_source.as_ptr(), std::ptr::null());
|
||||
c.CompileShader(shader);
|
||||
shader
|
||||
}
|
||||
|
||||
unsafe fn link_program(c: &Gles2, vert: u32, frag: u32) -> u32 {
|
||||
let program = c.CreateProgram();
|
||||
c.AttachShader(vert, VERTEX_SHADER);
|
||||
c.AttachShader(frag, FRAGMENT_SHADER);
|
||||
c.LinkProgram(program);
|
||||
program
|
||||
}
|
||||
|
||||
pub unsafe fn shader_inject(c: &Gles2, sk_shader: &mut Shader, vert_str: &str, frag_str: &str) {
|
||||
let gl_vert = load_shader(c, vert_str, VERTEX_SHADER);
|
||||
let gl_frag = load_shader(c, frag_str, FRAGMENT_SHADER);
|
||||
let gl_prog = link_program(c, gl_vert, gl_frag);
|
||||
|
||||
let shader: *mut FfiShader = transmute(sk_shader.0.as_mut());
|
||||
if let Some(shader) = shader.as_mut() {
|
||||
shader.shader.vertex = gl_vert;
|
||||
shader.shader.pixel = gl_frag;
|
||||
shader.shader.program = gl_prog;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user