e2r 0.10.0

experimental rendering engine in rust
Documentation
extern crate gl;

use ::std::mem;
use ::std::ffi::CStr;
use ::std::os::raw::c_char;
use ::std::fmt;
use ::std::vec::Vec;

pub struct CapabilityGL {
    ver: String,
    opengl_ver_major: i32,
    opengl_ver_minor: i32,
    glsl_ver: String,
    vendor: String,
    renderer: String,
    extensions: Vec< String >,
}

impl fmt::Display for CapabilityGL {
    fn fmt( &self, f: & mut fmt::Formatter ) -> fmt::Result {
        write!( f, "version: {}\n", self.ver )?;
        write!( f, "opengl version: {}.{}\n", self.opengl_ver_major, self.opengl_ver_minor )?;
        write!( f, "glsl language version: {}.\n", self.glsl_ver )?;
        write!( f, "vendor: {}.\n", self.vendor )?;
        write!( f, "renderer: {}.\n", self.renderer )?;
        write!( f, "num extensions: {}", self.extensions.len() )?;
        for i in & self.extensions {
            write!( f, "extension: {}.\n", i )?;
        }
        Ok(())
    }
}

pub fn query_gl() -> CapabilityGL {
    unsafe {

        let renderer_ptr = mem::transmute::< * const u8, * const c_char >( gl::GetString( gl::RENDERER ) );
        let renderer = CStr::from_ptr( renderer_ptr ).to_str().expect("renderer retrieval failed");
        
        let vendor_ptr = mem::transmute::< * const u8, * const c_char >( gl::GetString( gl::VENDOR ) );
        let vendor = CStr::from_ptr( vendor_ptr ).to_str().expect("vendor retrieval failed");
        
        let version_ptr = mem::transmute::< * const u8, * const c_char >( gl::GetString( gl::VERSION ) );
        let version = CStr::from_ptr( version_ptr ).to_str().expect("version retrieval failed");
        
        let glsl_version_ptr = mem::transmute::< * const u8, * const c_char >( gl::GetString( gl::SHADING_LANGUAGE_VERSION ) );
        let glsl_version = CStr::from_ptr( glsl_version_ptr ).to_str().expect("glsl_version retrieval failed");
        
        let mut opengl_version_major : gl::types::GLint = 0;
        let mut opengl_version_minor : gl::types::GLint = 0;
        gl::GetIntegerv( gl::MAJOR_VERSION, & mut opengl_version_major );
        gl::GetIntegerv( gl::MINOR_VERSION, & mut opengl_version_minor );

        let mut nun_extensions : gl::types::GLint = 0;
        gl::GetIntegerv( gl::NUM_EXTENSIONS, & mut nun_extensions );
        
        let mut extensions = vec![];
        for i in 0..nun_extensions {
            let ext_ptr = mem::transmute::< * const u8, * const c_char >( gl::GetStringi( gl::EXTENSIONS, i as u32 ) );
            let ext = CStr::from_ptr( ext_ptr ).to_str().expect("extension retrieval failed");
            extensions.push( ext.to_string() );
        }
        
        let capability = CapabilityGL {
            ver: version.to_string(),
            glsl_ver: glsl_version.to_string(),
            opengl_ver_major: opengl_version_major,
            opengl_ver_minor: opengl_version_minor,
            vendor: vendor.to_string(),
            renderer: renderer.to_string(),
            extensions: extensions,
        };

        capability    
    }
}