rust/lib-hedgewars-engine/src/render/gl.rs
changeset 14705 19122a329774
parent 14702 29dbe9ce8b7d
child 14707 5237b4c44d11
--- a/rust/lib-hedgewars-engine/src/render/gl.rs	Fri Mar 22 20:01:47 2019 +0300
+++ b/rust/lib-hedgewars-engine/src/render/gl.rs	Fri Mar 22 20:26:29 2019 +0300
@@ -1,12 +1,7 @@
- use integral_geometry::Rect;
 
-use std::{
-    mem,
-    slice,
-    ptr,
-    ffi,
-    ffi::CString,
-};
+use integral_geometry::Rect;
+
+use std::{ffi, ffi::CString, mem, ptr, slice};
 
 #[derive(Debug)]
 pub struct Texture2D {
@@ -32,13 +27,13 @@
         internal_format: u32,
         format: u32,
         ty: u32,
-        filter: u32
+        filter: u32,
     ) -> Self {
         let mut handle = 0;
-        
+
         unsafe {
             gl::GenTextures(1, &mut handle);
-            
+
             gl::BindTexture(gl::TEXTURE_2D, handle);
             gl::PixelStorei(gl::UNPACK_ROW_LENGTH, data_stride as i32);
             gl::TexImage2D(
@@ -50,7 +45,7 @@
                 0,
                 format as u32,
                 ty,
-                data.as_ptr() as *const _
+                data.as_ptr() as *const _,
             );
 
             gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_WRAP_S, gl::CLAMP_TO_EDGE as i32);
@@ -59,9 +54,7 @@
             gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MAG_FILTER, filter as i32);
         }
 
-        Texture2D {
-            handle
-        }
+        Texture2D { handle }
     }
 
     pub fn update(&self, region: Rect, data: &[u8], data_stride: u32, format: u32, ty: u32) {
@@ -70,13 +63,13 @@
             gl::PixelStorei(gl::UNPACK_ROW_LENGTH, data_stride as i32);
             gl::TexSubImage2D(
                 gl::TEXTURE_2D,
-                0, // texture level
+                0,             // texture level
                 region.left(), // texture region
                 region.top(),
                 region.width() as i32 - 1,
                 region.height() as i32 - 1,
-                format, // data format
-                ty, // data type
+                format,                    // data format
+                ty,                        // data type
                 data.as_ptr() as *const _, // data ptr
             );
         }
@@ -110,12 +103,8 @@
             usage,
         }
     }
-    
-    fn with_data(
-        ty: u32,
-        usage: u32,
-        data: &[u8]
-    ) -> Buffer {
+
+    fn with_data(ty: u32, usage: u32, data: &[u8]) -> Buffer {
         let mut buffer = 0;
 
         unsafe {
@@ -127,7 +116,7 @@
         Buffer {
             handle: buffer,
             ty,
-            usage
+            usage,
         }
     }
 
@@ -141,20 +130,28 @@
 
     pub fn write_typed<T>(&self, data: &[T]) {
         unsafe {
-            let data = slice::from_raw_parts(
-                data.as_ptr() as *const u8,
-                data.len() * mem::size_of::<T>(),
+            let data =
+                slice::from_raw_parts(data.as_ptr() as *const u8, data.len() * mem::size_of::<T>());
+
+            gl::BindBuffer(self.ty, self.handle);
+            gl::BufferData(
+                self.ty,
+                data.len() as isize,
+                data.as_ptr() as *const _ as *const _,
+                self.usage,
             );
-            
-            gl::BindBuffer(self.ty, self.handle);
-            gl::BufferData(self.ty, data.len() as isize, data.as_ptr() as *const _ as *const _, self.usage);
         }
     }
-    
-    pub fn write(&self, data: &[u8]) {        
+
+    pub fn write(&self, data: &[u8]) {
         unsafe {
             gl::BindBuffer(self.ty, self.handle);
-            gl::BufferData(self.ty, data.len() as isize, data.as_ptr() as *const _ as *const _, self.usage);
+            gl::BufferData(
+                self.ty,
+                data.len() as isize,
+                data.as_ptr() as *const _ as *const _,
+                self.usage,
+            );
         }
     }
 }
@@ -192,7 +189,7 @@
     pub fn new<'a>(
         vs: &str,
         ps: Option<&str>,
-        bindings: &[VariableBinding<'a>]
+        bindings: &[VariableBinding<'a>],
     ) -> Result<Self, String> {
         unsafe fn compile_shader(ty: u32, shdr: &str) -> Result<u32, String> {
             let shader = gl::CreateShader(ty);
@@ -217,7 +214,7 @@
                 Ok(shader)
             }
         }
-        
+
         let vs = unsafe { compile_shader(gl::VERTEX_SHADER, vs)? };
         let ps = if let Some(ps) = ps {
             Some(unsafe { compile_shader(gl::FRAGMENT_SHADER, ps)? })
@@ -227,7 +224,7 @@
 
         unsafe {
             let program = gl::CreateProgram();
-            
+
             gl::AttachShader(program, vs);
             if let Some(ps) = ps {
                 gl::AttachShader(program, ps);
@@ -237,8 +234,12 @@
                 match bind {
                     &VariableBinding::Attribute(ref name, id) => {
                         let c_str = CString::new(name.as_bytes()).unwrap();
-                        gl::BindAttribLocation(program, id, c_str.to_bytes_with_nul().as_ptr() as *const _);     
-                    },
+                        gl::BindAttribLocation(
+                            program,
+                            id,
+                            c_str.to_bytes_with_nul().as_ptr() as *const _,
+                        );
+                    }
                     _ => {}
                 }
             }
@@ -270,29 +271,36 @@
                 match bind {
                     VariableBinding::Uniform(name, id) => {
                         let c_str = CString::new(name.as_bytes()).unwrap();
-                        let index = gl::GetUniformLocation(program, c_str.to_bytes_with_nul().as_ptr() as *const _);
+                        let index = gl::GetUniformLocation(
+                            program,
+                            c_str.to_bytes_with_nul().as_ptr() as *const _,
+                        );
 
                         // TODO: impl for block?
-                    },
+                    }
                     VariableBinding::UniformBlock(name, id) => {
                         let c_str = CString::new(name.as_bytes()).unwrap();
-                        let index = gl::GetUniformBlockIndex(program, c_str.to_bytes_with_nul().as_ptr() as *const _);
+                        let index = gl::GetUniformBlockIndex(
+                            program,
+                            c_str.to_bytes_with_nul().as_ptr() as *const _,
+                        );
 
                         gl::UniformBlockBinding(program, index, *id);
                     }
                     VariableBinding::Sampler(name, id) => {
                         let c_str = CString::new(name.as_bytes()).unwrap();
-                        let index = gl::GetUniformLocation(program, c_str.to_bytes_with_nul().as_ptr() as *const _);
-                        
+                        let index = gl::GetUniformLocation(
+                            program,
+                            c_str.to_bytes_with_nul().as_ptr() as *const _,
+                        );
+
                         gl::Uniform1i(index, *id as i32);
-                    },
+                    }
                     _ => {}
                 }
             }
 
-            Ok(Shader {
-                program
-            })
+            Ok(Shader { program })
         }
     }
 
@@ -305,15 +313,18 @@
     pub fn set_matrix(&self, name: &str, matrix: *const f32) {
         unsafe {
             let c_str = CString::new(name).unwrap();
-            let index = gl::GetUniformLocation(self.program, c_str.to_bytes_with_nul().as_ptr() as *const _);
-            
+            let index = gl::GetUniformLocation(
+                self.program,
+                c_str.to_bytes_with_nul().as_ptr() as *const _,
+            );
+
             gl::UniformMatrix4fv(index, 1, gl::FALSE, matrix);
         }
     }
 
     pub fn bind_texture_2d(&self, index: u32, texture: &Texture2D) {
         self.bind();
-        
+
         unsafe {
             gl::ActiveTexture(gl::TEXTURE0 + index);
             gl::BindTexture(gl::TEXTURE_2D, texture.handle);
@@ -335,13 +346,13 @@
     pub offset: u32,
 }
 
-// TODO: 
+// TODO:
 pub struct InputLayout {
     pub elements: Vec<InputElement>,
 }
 
 pub struct LayoutGuard {
-    vao: u32
+    vao: u32,
 }
 
 impl Drop for LayoutGuard {
@@ -355,24 +366,26 @@
 
 impl InputLayout {
     pub fn new(elements: Vec<InputElement>) -> Self {
-        InputLayout {
-            elements,
-        }
+        InputLayout { elements }
     }
 
-    pub fn bind(&mut self, buffers: &[(u32, &Buffer)], index_buffer: Option<&Buffer>) -> LayoutGuard {
+    pub fn bind(
+        &mut self,
+        buffers: &[(u32, &Buffer)],
+        index_buffer: Option<&Buffer>,
+    ) -> LayoutGuard {
         let mut vao = 0;
-        
+
         unsafe {
             gl::GenVertexArrays(1, &mut vao);
             gl::BindVertexArray(vao);
         }
-        
+
         for &(slot, ref buffer) in buffers {
             unsafe {
                 gl::BindBuffer(buffer.ty(), buffer.handle());
             }
-            
+
             for attr in self.elements.iter().filter(|a| a.buffer_slot == slot) {
                 unsafe {
                     gl::EnableVertexAttribArray(attr.shader_slot);
@@ -382,13 +395,9 @@
                                 attr.shader_slot,
                                 attr.components as i32,
                                 fmt,
-                                if normalized {
-                                    gl::TRUE
-                                } else {
-                                    gl::FALSE
-                                },
+                                if normalized { gl::TRUE } else { gl::FALSE },
                                 attr.stride as i32,
-                                attr.offset as *const _
+                                attr.offset as *const _,
                             );
                         }
                         InputFormat::Integer(fmt) => {
@@ -397,11 +406,10 @@
                                 attr.components as i32,
                                 fmt,
                                 attr.stride as i32,
-                                attr.offset as *const _
+                                attr.offset as *const _,
                             );
                         }
                     }
-
                 }
             }
         }
@@ -412,8 +420,6 @@
             }
         }
 
-        LayoutGuard {
-            vao
-        }
+        LayoutGuard { vao }
     }
 }