fn render_cube(cubevao: &mut u32, cubevbo: &mut u32) {
    if *cubevao == 0 {
        let vertices: [f32; 288] = [
            // back face
            -1.0, -1.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, // bottom-left
            1.0, 1.0, -1.0, 0.0, 0.0, -1.0, 1.0, 1.0, // top-right
            1.0, -1.0, -1.0, 0.0, 0.0, -1.0, 1.0, 0.0, // bottom-right
            1.0, 1.0, -1.0, 0.0, 0.0, -1.0, 1.0, 1.0, // top-right
            -1.0, -1.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, // bottom-left
            -1.0, 1.0, -1.0, 0.0, 0.0, -1.0, 0.0, 1.0, // top-left
            // front face
            -1.0, -1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, // bottom-left
            1.0, -1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, // bottom-right
            1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, // top-right
            1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, // top-right
            -1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, // top-left
            -1.0, -1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, // bottom-left
            // left face
            -1.0, 1.0, 1.0, -1.0, 0.0, 0.0, 1.0, 0.0, // top-right
            -1.0, 1.0, -1.0, -1.0, 0.0, 0.0, 1.0, 1.0, // top-left
            -1.0, -1.0, -1.0, -1.0, 0.0, 0.0, 0.0, 1.0, // bottom-left
            -1.0, -1.0, -1.0, -1.0, 0.0, 0.0, 0.0, 1.0, // bottom-left
            -1.0, -1.0, 1.0, -1.0, 0.0, 0.0, 0.0, 0.0, // bottom-right
            -1.0, 1.0, 1.0, -1.0, 0.0, 0.0, 1.0, 0.0, // top-right
            // right face
            1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, // top-left
            1.0, -1.0, -1.0, 1.0, 0.0, 0.0, 0.0, 1.0, // bottom-right
            1.0, 1.0, -1.0, 1.0, 0.0, 0.0, 1.0, 1.0, // top-right
            1.0, -1.0, -1.0, 1.0, 0.0, 0.0, 0.0, 1.0, // bottom-right
            1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, // top-left
            1.0, -1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, // bottom-left
            // bottom face
            -1.0, -1.0, -1.0, 0.0, -1.0, 0.0, 0.0, 1.0, // top-right
            1.0, -1.0, -1.0, 0.0, -1.0, 0.0, 1.0, 1.0, // top-left
            1.0, -1.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, // bottom-left
            1.0, -1.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, // bottom-left
            -1.0, -1.0, 1.0, 0.0, -1.0, 0.0, 0.0, 0.0, // bottom-right
            -1.0, -1.0, -1.0, 0.0, -1.0, 0.0, 0.0, 1.0, // top-right
            // top face
            -1.0, 1.0, -1.0, 0.0, 1.0, 0.0, 0.0, 1.0, // top-left
            1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, // bottom-right
            1.0, 1.0, -1.0, 0.0, 1.0, 0.0, 1.0, 1.0, // top-right
            1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, // bottom-right
            -1.0, 1.0, -1.0, 0.0, 1.0, 0.0, 0.0, 1.0, // top-left
            -1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, // bottom-left
        ];

        *cubevao = gl::gen_vertex_array();
        *cubevbo = gl::gen_buffer();
        // fill buffer
        gl::bind_buffer(GL_ARRAY_BUFFER, *cubevbo);
        // let size = (vertices.len() * mem::size_of::<f32>()) as isize;
        // let data = &vertices[0];
        gl::buffer_data(GL_ARRAY_BUFFER, &vertices, GL_STATIC_DRAW);
        // link vertex attributes
        gl::bind_vertex_array(*cubevao);
        let stride = 8 * mem::size_of::<f32>() as i32;
        gl::enable_vertex_attrib_array(0);
        gl::vertex_attrib_pointer_offset(0, 3, GL_FLOAT, false, stride, 0);
        gl::enable_vertex_attrib_array(1);
        gl::vertex_attrib_pointer_offset(1, 3, GL_FLOAT, false, stride, 3 * mem::size_of::<f32>() as u32);
        gl::enable_vertex_attrib_array(2);
        gl::vertex_attrib_pointer_offset(2, 2, GL_FLOAT, false, stride, 6 * mem::size_of::<f32>() as u32);
        gl::bind_buffer(GL_ARRAY_BUFFER, 0);
        gl::bind_vertex_array(0);
    }
    // render Cube
    gl::bind_vertex_array(*cubevao);
    gl::draw_arrays(GL_TRIANGLES, 0, 36);
    gl::bind_vertex_array(0);
}
// renderCube() renders a 1x1 3D cube in NDC.
renderCube() renders a 1x1 3D cube in NDC.
renderCube () renders a 1x1 3D cube in NDC .
fn render_cube(cubevao: &mut u32, cubevbo: &mut u32) {
    if *cubevao == 0 {
        let vertices: [f32; 288] = [
            // back face
            -1.0, -1.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, // bottom-left
            1.0, 1.0, -1.0, 0.0, 0.0, -1.0, 1.0, 1.0, // top-right
            1.0, -1.0, -1.0, 0.0, 0.0, -1.0, 1.0, 0.0, // bottom-right
            1.0, 1.0, -1.0, 0.0, 0.0, -1.0, 1.0, 1.0, // top-right
            -1.0, -1.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, // bottom-left
            -1.0, 1.0, -1.0, 0.0, 0.0, -1.0, 0.0, 1.0, // top-left
            // front face
            -1.0, -1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, // bottom-left
            1.0, -1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, // bottom-right
            1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, // top-right
            1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, // top-right
            -1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, // top-left
            -1.0, -1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, // bottom-left
            // left face
            -1.0, 1.0, 1.0, -1.0, 0.0, 0.0, 1.0, 0.0, // top-right
            -1.0, 1.0, -1.0, -1.0, 0.0, 0.0, 1.0, 1.0, // top-left
            -1.0, -1.0, -1.0, -1.0, 0.0, 0.0, 0.0, 1.0, // bottom-left
            -1.0, -1.0, -1.0, -1.0, 0.0, 0.0, 0.0, 1.0, // bottom-left
            -1.0, -1.0, 1.0, -1.0, 0.0, 0.0, 0.0, 0.0, // bottom-right
            -1.0, 1.0, 1.0, -1.0, 0.0, 0.0, 1.0, 0.0, // top-right
            // right face
            1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, // top-left
            1.0, -1.0, -1.0, 1.0, 0.0, 0.0, 0.0, 1.0, // bottom-right
            1.0, 1.0, -1.0, 1.0, 0.0, 0.0, 1.0, 1.0, // top-right
            1.0, -1.0, -1.0, 1.0, 0.0, 0.0, 0.0, 1.0, // bottom-right
            1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, // top-left
            1.0, -1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, // bottom-left
            // bottom face
            -1.0, -1.0, -1.0, 0.0, -1.0, 0.0, 0.0, 1.0, // top-right
            1.0, -1.0, -1.0, 0.0, -1.0, 0.0, 1.0, 1.0, // top-left
            1.0, -1.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, // bottom-left
            1.0, -1.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, // bottom-left
            -1.0, -1.0, 1.0, 0.0, -1.0, 0.0, 0.0, 0.0, // bottom-right
            -1.0, -1.0, -1.0, 0.0, -1.0, 0.0, 0.0, 1.0, // top-right
            // top face
            -1.0, 1.0, -1.0, 0.0, 1.0, 0.0, 0.0, 1.0, // top-left
            1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, // bottom-right
            1.0, 1.0, -1.0, 0.0, 1.0, 0.0, 1.0, 1.0, // top-right
            1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, // bottom-right
            -1.0, 1.0, -1.0, 0.0, 1.0, 0.0, 0.0, 1.0, // top-left
            -1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, // bottom-left
        ];
        *cubevao = gl::gen_vertex_array();
        *cubevbo = gl::gen_buffer();
        // fill buffer
        gl::bind_buffer(GL_ARRAY_BUFFER, *cubevbo);
        // let size = (vertices.len() * mem::size_of::<f32>()) as isize;
        // let data = &vertices[0];
        gl::buffer_data(GL_ARRAY_BUFFER, &vertices, GL_STATIC_DRAW);
        // link vertex attributes
        gl::bind_vertex_array(*cubevao);
        let stride = 8 * mem::size_of::<f32>() as i32;
        gl::enable_vertex_attrib_array(0);
        gl::vertex_attrib_pointer_offset(0, 3, GL_FLOAT, false, stride, 0);
        gl::enable_vertex_attrib_array(1);
        gl::vertex_attrib_pointer_offset(1, 3, GL_FLOAT, false, stride, 3 * mem::size_of::<f32>() as u32);
        gl::enable_vertex_attrib_array(2);
        gl::vertex_attrib_pointer_offset(2, 2, GL_FLOAT, false, stride, 6 * mem::size_of::<f32>() as u32);
        gl::bind_buffer(GL_ARRAY_BUFFER, 0);
        gl::bind_vertex_array(0);
    }
    // render Cube
    gl::bind_vertex_array(*cubevao);
    gl::draw_arrays(GL_TRIANGLES, 0, 36);
    gl::bind_vertex_array(0);
}
fn render_cube ( cubevao : & mut u32 , cubevbo : & mut u32 ) { if * cubevao == 0 { let vertices : [ f32 ; 288 ] = [ // back face - 1.0 , - 1.0 , - 1.0 , 0.0 , 0.0 , - 1.0 , 0.0 , 0.0 , // bottom-left 1.0 , 1.0 , - 1.0 , 0.0 , 0.0 , - 1.0 , 1.0 , 1.0 , // top-right 1.0 , - 1.0 , - 1.0 , 0.0 , 0.0 , - 1.0 , 1.0 , 0.0 , // bottom-right 1.0 , 1.0 , - 1.0 , 0.0 , 0.0 , - 1.0 , 1.0 , 1.0 , // top-right - 1.0 , - 1.0 , - 1.0 , 0.0 , 0.0 , - 1.0 , 0.0 , 0.0 , // bottom-left - 1.0 , 1.0 , - 1.0 , 0.0 , 0.0 , - 1.0 , 0.0 , 1.0 , // top-left // front face - 1.0 , - 1.0 , 1.0 , 0.0 , 0.0 , 1.0 , 0.0 , 0.0 , // bottom-left 1.0 , - 1.0 , 1.0 , 0.0 , 0.0 , 1.0 , 1.0 , 0.0 , // bottom-right 1.0 , 1.0 , 1.0 , 0.0 , 0.0 , 1.0 , 1.0 , 1.0 , // top-right 1.0 , 1.0 , 1.0 , 0.0 , 0.0 , 1.0 , 1.0 , 1.0 , // top-right - 1.0 , 1.0 , 1.0 , 0.0 , 0.0 , 1.0 , 0.0 , 1.0 , // top-left - 1.0 , - 1.0 , 1.0 , 0.0 , 0.0 , 1.0 , 0.0 , 0.0 , // bottom-left // left face - 1.0 , 1.0 , 1.0 , - 1.0 , 0.0 , 0.0 , 1.0 , 0.0 , // top-right - 1.0 , 1.0 , - 1.0 , - 1.0 , 0.0 , 0.0 , 1.0 , 1.0 , // top-left - 1.0 , - 1.0 , - 1.0 , - 1.0 , 0.0 , 0.0 , 0.0 , 1.0 , // bottom-left - 1.0 , - 1.0 , - 1.0 , - 1.0 , 0.0 , 0.0 , 0.0 , 1.0 , // bottom-left - 1.0 , - 1.0 , 1.0 , - 1.0 , 0.0 , 0.0 , 0.0 , 0.0 , // bottom-right - 1.0 , 1.0 , 1.0 , - 1.0 , 0.0 , 0.0 , 1.0 , 0.0 , // top-right // right face 1.0 , 1.0 , 1.0 , 1.0 , 0.0 , 0.0 , 1.0 , 0.0 , // top-left 1.0 , - 1.0 , - 1.0 , 1.0 , 0.0 , 0.0 , 0.0 , 1.0 , // bottom-right 1.0 , 1.0 , - 1.0 , 1.0 , 0.0 , 0.0 , 1.0 , 1.0 , // top-right 1.0 , - 1.0 , - 1.0 , 1.0 , 0.0 , 0.0 , 0.0 , 1.0 , // bottom-right 1.0 , 1.0 , 1.0 , 1.0 , 0.0 , 0.0 , 1.0 , 0.0 , // top-left 1.0 , - 1.0 , 1.0 , 1.0 , 0.0 , 0.0 , 0.0 , 0.0 , // bottom-left // bottom face - 1.0 , - 1.0 , - 1.0 , 0.0 , - 1.0 , 0.0 , 0.0 , 1.0 , // top-right 1.0 , - 1.0 , - 1.0 , 0.0 , - 1.0 , 0.0 , 1.0 , 1.0 , // top-left 1.0 , - 1.0 , 1.0 , 0.0 , - 1.0 , 0.0 , 1.0 , 0.0 , // bottom-left 1.0 , - 1.0 , 1.0 , 0.0 , - 1.0 , 0.0 , 1.0 , 0.0 , // bottom-left - 1.0 , - 1.0 , 1.0 , 0.0 , - 1.0 , 0.0 , 0.0 , 0.0 , // bottom-right - 1.0 , - 1.0 , - 1.0 , 0.0 , - 1.0 , 0.0 , 0.0 , 1.0 , // top-right // top face - 1.0 , 1.0 , - 1.0 , 0.0 , 1.0 , 0.0 , 0.0 , 1.0 , // top-left 1.0 , 1.0 , 1.0 , 0.0 , 1.0 , 0.0 , 1.0 , 0.0 , // bottom-right 1.0 , 1.0 , - 1.0 , 0.0 , 1.0 , 0.0 , 1.0 , 1.0 , // top-right 1.0 , 1.0 , 1.0 , 0.0 , 1.0 , 0.0 , 1.0 , 0.0 , // bottom-right - 1.0 , 1.0 , - 1.0 , 0.0 , 1.0 , 0.0 , 0.0 , 1.0 , // top-left - 1.0 , 1.0 , 1.0 , 0.0 , 1.0 , 0.0 , 0.0 , 0.0 , // bottom-left ] ; * cubevao = gl :: gen_vertex_array ( ) ; * cubevbo = gl :: gen_buffer ( ) ; // fill buffer gl :: bind_buffer ( GL_ARRAY_BUFFER , * cubevbo ) ; // let size = (vertices.len() * mem::size_of::<f32>()) as isize; // let data = &vertices[0]; gl :: buffer_data ( GL_ARRAY_BUFFER , & vertices , GL_STATIC_DRAW ) ; // link vertex attributes gl :: bind_vertex_array ( * cubevao ) ; let stride = 8 * mem :: size_of :: < f32 > ( ) as i32 ; gl :: enable_vertex_attrib_array ( 0 ) ; gl :: vertex_attrib_pointer_offset ( 0 , 3 , GL_FLOAT , false , stride , 0 ) ; gl :: enable_vertex_attrib_array ( 1 ) ; gl :: vertex_attrib_pointer_offset ( 1 , 3 , GL_FLOAT , false , stride , 3 * mem :: size_of :: < f32 > ( ) as u32 ) ; gl :: enable_vertex_attrib_array ( 2 ) ; gl :: vertex_attrib_pointer_offset ( 2 , 2 , GL_FLOAT , false , stride , 6 * mem :: size_of :: < f32 > ( ) as u32 ) ; gl :: bind_buffer ( GL_ARRAY_BUFFER , 0 ) ; gl :: bind_vertex_array ( 0 ) ; } // render Cube gl :: bind_vertex_array ( * cubevao ) ; gl :: draw_arrays ( GL_TRIANGLES , 0 , 36 ) ; gl :: bind_vertex_array ( 0 ) ; }
renderCube() renders a 1x1 3D cube in NDC.
renderCube () renders a 1x1 3D cube in NDC .
cubevao
&mut u32
cubevbo
&mut u32
cubevao
&mut u32
cubevbo
&mut u32