diff options
Diffstat (limited to 'examples/support')
-rw-r--r-- | examples/support/mod.rs | 104 |
1 files changed, 64 insertions, 40 deletions
diff --git a/examples/support/mod.rs b/examples/support/mod.rs index 01eeb7b..7e9aa4f 100644 --- a/examples/support/mod.rs +++ b/examples/support/mod.rs @@ -1,19 +1,15 @@ #![cfg(feature = "window")] use std::ffi::CStr; +use std::mem; +use std::ptr; use glutin; -#[cfg(not(target_os = "android"))] mod gl { + pub use self::Gles2 as Gl; include!(concat!(env!("OUT_DIR"), "/test_gl_bindings.rs")); } -#[cfg(target_os = "android")] -mod gl { - pub use self::Gles1 as Gl; - include!(concat!(env!("OUT_DIR"), "/test_gles1_bindings.rs")); -} - pub struct Context { gl: gl::Gl } @@ -28,30 +24,47 @@ pub fn load(window: &glutin::Window) -> Context { println!("OpenGL version {}", version); + unsafe { + let vs = gl.CreateShader(gl::VERTEX_SHADER); + gl.ShaderSource(vs, 1, [VS_SRC.as_ptr() as *const i8].as_ptr(), ptr::null()); + gl.CompileShader(vs); + + let fs = gl.CreateShader(gl::FRAGMENT_SHADER); + gl.ShaderSource(fs, 1, [FS_SRC.as_ptr() as *const i8].as_ptr(), ptr::null()); + gl.CompileShader(fs); + + let program = gl.CreateProgram(); + gl.AttachShader(program, vs); + gl.AttachShader(program, fs); + gl.LinkProgram(program); + gl.UseProgram(program); + + let mut vb = mem::uninitialized(); + gl.GenBuffers(1, &mut vb); + gl.BindBuffer(gl::ARRAY_BUFFER, vb); + gl.BufferData(gl::ARRAY_BUFFER, + (VERTEX_DATA.len() * mem::size_of::<f32>()) as gl::types::GLsizeiptr, + VERTEX_DATA.as_ptr() as *const _, gl::STATIC_DRAW); + + /*let mut vao = mem::uninitialized(); + gl.GenVertexArrays(1, &mut vao); + gl.BindVertexArray(vao);*/ + let pos_attrib = gl.GetAttribLocation(program, b"position\0".as_ptr() as *const _); + let color_attrib = gl.GetAttribLocation(program, b"color\0".as_ptr() as *const _); + gl.VertexAttribPointer(pos_attrib as gl::types::GLuint, 2, gl::FLOAT, 0, + 5 * mem::size_of::<f32>() as gl::types::GLsizei, + ptr::null()); + gl.VertexAttribPointer(color_attrib as gl::types::GLuint, 3, gl::FLOAT, 0, + 5 * mem::size_of::<f32>() as gl::types::GLsizei, + (2 * mem::size_of::<f32>()) as *const () as *const _); + gl.EnableVertexAttribArray(pos_attrib as gl::types::GLuint); + gl.EnableVertexAttribArray(color_attrib as gl::types::GLuint); + } + Context { gl: gl } } impl Context { - #[cfg(not(target_os = "android"))] - pub fn draw_frame(&self, color: (f32, f32, f32, f32)) { - unsafe { - self.gl.ClearColor(color.0, color.1, color.2, color.3); - self.gl.Clear(gl::COLOR_BUFFER_BIT); - - self.gl.Begin(gl::TRIANGLES); - self.gl.Color3f(1.0, 0.0, 0.0); - self.gl.Vertex2f(-0.5, -0.5); - self.gl.Color3f(0.0, 1.0, 0.0); - self.gl.Vertex2f(0.0, 0.5); - self.gl.Color3f(0.0, 0.0, 1.0); - self.gl.Vertex2f(0.5, -0.5); - self.gl.End(); - - self.gl.Flush(); - } - } - - #[cfg(target_os = "android")] pub fn draw_frame(&self, color: (f32, f32, f32, f32)) { use std::mem; @@ -59,26 +72,37 @@ impl Context { self.gl.ClearColor(color.0, color.1, color.2, color.3); self.gl.Clear(gl::COLOR_BUFFER_BIT); - self.gl.EnableClientState(gl::VERTEX_ARRAY); - self.gl.EnableClientState(gl::COLOR_ARRAY); - - self.gl.VertexPointer(2, gl::FLOAT, (mem::size_of::<f32>() * 5) as i32, - mem::transmute(VERTEX_DATA.as_ptr())); - self.gl.ColorPointer(3, gl::FLOAT, (mem::size_of::<f32>() * 5) as i32, - mem::transmute(VERTEX_DATA.as_ptr().offset(2))); - self.gl.DrawArrays(gl::TRIANGLES, 0, 3); - self.gl.DisableClientState(gl::VERTEX_ARRAY); - self.gl.DisableClientState(gl::COLOR_ARRAY); - - self.gl.Flush(); } } } -#[cfg(target_os = "android")] static VERTEX_DATA: [f32; 15] = [ -0.5, -0.5, 1.0, 0.0, 0.0, 0.0, 0.5, 0.0, 1.0, 0.0, 0.5, -0.5, 0.0, 0.0, 1.0 ]; + +const VS_SRC: &'static [u8] = b" +#version 100 + +lowp attribute vec2 position; +lowp attribute vec3 color; + +lowp varying vec3 v_color; + +void main() { + gl_Position = vec4(position, 0.0, 1.0); + v_color = color; +} +\0"; + +const FS_SRC: &'static [u8] = b" +#version 100 + +lowp varying vec3 v_color; + +void main() { + gl_FragColor = vec4(v_color, 1.0); +} +\0"; |