aboutsummaryrefslogtreecommitdiffstats
path: root/examples/support/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/support/mod.rs')
-rw-r--r--examples/support/mod.rs104
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";