diff options
Diffstat (limited to 'engine/src/renderer')
| -rw-r--r-- | engine/src/renderer/opengl.rs | 49 | 
1 files changed, 14 insertions, 35 deletions
diff --git a/engine/src/renderer/opengl.rs b/engine/src/renderer/opengl.rs index c098548..6a571eb 100644 --- a/engine/src/renderer/opengl.rs +++ b/engine/src/renderer/opengl.rs @@ -64,7 +64,7 @@ use crate::opengl::{  use crate::projection::{ClipVolume, Projection};  use crate::texture::{Id as TextureId, Texture};  use crate::transform::{Position, Scale}; -use crate::util::NeverDrop; +use crate::util::{defer, Defer, RefOrValue};  use crate::vector::{Vec2, Vec3};  use crate::vertex::{AttributeComponentType, Vertex};  use crate::window::Window; @@ -174,21 +174,17 @@ fn render(              .map(|material_flags| material_flags.clone())              .unwrap_or_default(); -        let new_gl_objects; - -        let gl_objects = if let Some(gl_objects) = gl_objects.as_deref() { -            gl_objects -        } else { -            // TODO: Account for when meshes are changed -            let gl_objects = GlObjects::new(&mesh); - -            new_gl_objects = Some(gl_objects.clone()); - -            actions.add_components(euid, (gl_objects,)); - -            &*new_gl_objects.unwrap() +        let gl_objs = match gl_objects.as_deref() { +            Some(gl_objs) => RefOrValue::Ref(gl_objs), +            None => RefOrValue::Value(Some(GlObjects::new(&mesh))),          }; +        defer!(|gl_objs| { +            if let RefOrValue::Value(opt_gl_objs) = gl_objs { +                actions.add_components(euid, (opt_gl_objs.take().unwrap(),)); +            }; +        }); +          apply_transformation_matrices(              Transformation {                  position: position.map(|pos| *pos).unwrap_or_default().position, @@ -235,7 +231,7 @@ fn render(              );          } -        draw_mesh(gl_objects); +        draw_mesh(gl_objs.get().unwrap());          if draw_flags.is_some() {              let default_polygon_mode_config = PolygonModeConfig::default(); @@ -360,7 +356,7 @@ fn get_glsl_shader_content(path: &Path) -> Result<Vec<u8>, std::io::Error>  struct GlObjects  {      /// Vertex and index buffer has to live as long as the vertex array -    vertex_buffer: Buffer<Vertex>, +    _vertex_buffer: Buffer<Vertex>,      index_buffer: Option<Buffer<u32>>,      element_cnt: u32, @@ -415,7 +411,7 @@ impl GlObjects              vertex_arr.bind_element_buffer(&index_buffer);              return Self { -                vertex_buffer, +                _vertex_buffer: vertex_buffer,                  index_buffer: Some(index_buffer),                  element_cnt: indices                      .len() @@ -426,7 +422,7 @@ impl GlObjects          }          Self { -            vertex_buffer, +            _vertex_buffer: vertex_buffer,              index_buffer: None,              element_cnt: mesh                  .vertices() @@ -436,23 +432,6 @@ impl GlObjects              vertex_arr,          }      } - -    pub fn clone(&self) -> NeverDrop<Self> -    { -        NeverDrop::new(Self { -            // SAFETY: The vertex buffer will never become dropped (NeverDrop ensures it) -            vertex_buffer: unsafe { self.vertex_buffer.clone_weak() }, -            index_buffer: self -                .index_buffer -                .as_ref() -                // SAFETY: The index buffer will never become dropped (NeverDrop ensures -                // it) -                .map(|index_buffer| unsafe { index_buffer.clone_weak() }), -            element_cnt: self.element_cnt, -            // SAFETY: The vertex array will never become dropped (NeverDrop ensures it) -            vertex_arr: unsafe { self.vertex_arr.clone_unsafe() }, -        }) -    }  }  fn apply_transformation_matrices(  | 
