1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
use glin; use gl; use ::Material; use color::{Rgba,ToRgba}; use na::Vec2; use color::consts::WHITE; use glin::RenderSurface; pub struct OutlineMaterial{ color: Rgba<f32>, offset: f32, viewport: Vec2, } pub struct Builder{ color: Rgba<f32>, offset: f32, viewport: Vec2, } impl Builder{ pub fn new(viewport: Vec2) -> Builder{ Builder{ color: WHITE.to_rgba(), offset: 0.01, viewport, } } pub fn offset(&mut self, offset: f32) -> &mut Builder{ self.offset = offset; self } pub fn color<C: ToRgba>(&mut self, color: C) -> &mut Builder{ self.color = color.to_rgba(); self } pub fn create(&self) -> OutlineMaterial{ OutlineMaterial{ color: self.color, offset: self.offset, viewport: self.viewport, } } } impl OutlineMaterial{ pub fn set_viewport(&mut self, viewport: Vec2){ self.viewport = viewport; } pub fn viewport(&self) -> Vec2{ self.viewport } pub fn set_offset(&mut self, offset: f32){ self.offset = offset; } pub fn offset(&self) -> f32{ self.offset } pub fn set_color<C: ToRgba>(&mut self, color: C){ self.color = color.to_rgba(); } pub fn color(&self) -> Rgba<f32>{ self.color } } impl Material for OutlineMaterial{ fn program<R: RenderSurface>(&self, renderer: &::Renderer<R>) -> &glin::Program{ get_program(renderer) } fn uniforms<R: RenderSurface>(&self, _: &::Renderer<R>) -> Vec<glin::program::Uniform>{ uniforms!{ color_outline: self.color, offset: self.offset, viewport: self.viewport, } } fn properties(&self) -> Vec<glin::Property>{ vec![glin::Property::CullFace(Some(gl::FRONT))] } } program_cache!("shaders/outline.vs.glsl", "shaders/outline.fs.glsl");