From 9528025a238f12ccfd257aaddf4d285ae584806b Mon Sep 17 00:00:00 2001 From: Erin Date: Sun, 20 Aug 2017 17:09:51 -0500 Subject: [PATCH] textium: start work on a gl/glium renderer --- textium/src/lib.rs | 1 + textium/src/renderer/gl_renderer_140.frag | 17 ++++++++++++++++ textium/src/renderer/gl_renderer_140.vert | 12 +++++++++++ textium/src/renderer/glium_renderer.rs | 34 +++++++++++++++++++++++++++++++ textium/src/renderer/mod.rs | 3 +++ 5 files changed, 67 insertions(+) create mode 100644 textium/src/renderer/gl_renderer_140.frag create mode 100644 textium/src/renderer/gl_renderer_140.vert create mode 100644 textium/src/renderer/glium_renderer.rs create mode 100644 textium/src/renderer/mod.rs diff --git a/textium/src/lib.rs b/textium/src/lib.rs index 83b9740..c99d35f 100644 --- a/textium/src/lib.rs +++ b/textium/src/lib.rs @@ -15,6 +15,7 @@ pub mod geometry; pub mod rasterizer; pub mod packer; pub mod cache; +pub mod renderer; use std::collections::HashMap; use std::hash::{Hash, Hasher}; diff --git a/textium/src/renderer/gl_renderer_140.frag b/textium/src/renderer/gl_renderer_140.frag new file mode 100644 index 0000000..fb00b9d --- /dev/null +++ b/textium/src/renderer/gl_renderer_140.frag @@ -0,0 +1,17 @@ +#version 140 + +in vec2 v_tex_coord; + +out vec4 frag_color; + +uniform sampler2D tex; + +void main() { + vec4 c = vec4(0, 0, 0, texture(tex, v_tex_coord)); + + if (c.a <= 0.01) { + discard; + } else { + frag_color = c; + } +} diff --git a/textium/src/renderer/gl_renderer_140.vert b/textium/src/renderer/gl_renderer_140.vert new file mode 100644 index 0000000..f97643d --- /dev/null +++ b/textium/src/renderer/gl_renderer_140.vert @@ -0,0 +1,12 @@ +#version 140 + +in vec2 position; +in vec2 tex_coord; + +out vec2 v_tex_coord; + +void main() { + gl_Position = vec4(position, 0.0, 1.0); + + v_tex_coord = tex_coord; +} diff --git a/textium/src/renderer/glium_renderer.rs b/textium/src/renderer/glium_renderer.rs new file mode 100644 index 0000000..6f65e7e --- /dev/null +++ b/textium/src/renderer/glium_renderer.rs @@ -0,0 +1,34 @@ +use glium::Program; +use glium::backend::Facade; + +#[derive(Copy, Clone, Debug)] +struct Vertex { + position: [u32; 2], + tex_coords: [u32; 2], +} + +implement_vertex!(Vertex, position, tex_coords); + +static SHADER_FRAG_140: &'static str = include_str!("gl_renderer_140.frag"); +static SHADER_VERT_140: &'static str = include_str!("gl_renderer_140.vert"); + +pub struct TextRenderer { + gl_program: Program, +} + +impl TextRenderer { + pub fn new(display: &F) -> TextRenderer where F: Facade { + let program = program!(display, + 140 => { + vertex: SHADER_VERT_140, + fragment: SHADER_FRAG_140, + }, + ).expect("textium: could not compile glium renderer shaders"); + + TextRenderer { + gl_program: program, + } + } + + // pub fn draw(text: RenderableText) +} diff --git a/textium/src/renderer/mod.rs b/textium/src/renderer/mod.rs new file mode 100644 index 0000000..84ae47f --- /dev/null +++ b/textium/src/renderer/mod.rs @@ -0,0 +1,3 @@ +mod glium_renderer; + +pub use self::glium_renderer::TextRenderer as GliumRenderer;