From 991a3121c17b0e66c88ad002d8a561afa82f2747 Mon Sep 17 00:00:00 2001 From: Dmitry Stepanov Date: Tue, 8 Oct 2024 20:17:18 +0300 Subject: [PATCH] moved drawing methods to framebuffer --- fyrox-graphics/src/geometry_buffer.rs | 78 +++------------------------ fyrox-graphics/src/gl/framebuffer.rs | 54 ++++++++++++++++++- 2 files changed, 60 insertions(+), 72 deletions(-) diff --git a/fyrox-graphics/src/geometry_buffer.rs b/fyrox-graphics/src/geometry_buffer.rs index 61fc6e761..2b3fa0732 100644 --- a/fyrox-graphics/src/geometry_buffer.rs +++ b/fyrox-graphics/src/geometry_buffer.rs @@ -23,19 +23,19 @@ use crate::{ core::{array_as_u8_slice, math::TriangleDefinition}, error::FrameworkError, gl::{buffer::GlBuffer, server::GlGraphicsServer, ToGlConstant}, - ElementKind, ElementRange, + ElementKind, }; use bytemuck::Pod; use glow::HasContext; use std::{cell::Cell, marker::PhantomData, mem::size_of, rc::Weak}; pub struct GeometryBuffer { - state: Weak, - vertex_array_object: glow::VertexArray, - buffers: Vec, - element_buffer: GlBuffer, - element_count: Cell, - element_kind: ElementKind, + pub state: Weak, + pub vertex_array_object: glow::VertexArray, + pub buffers: Vec, + pub element_buffer: GlBuffer, + pub element_count: Cell, + pub element_kind: ElementKind, // Force compiler to not implement Send and Sync, because OpenGL is not thread-safe. thread_mark: PhantomData<*const u8>, } @@ -206,75 +206,13 @@ impl GeometryBuffer { self.element_buffer.write_data(data).unwrap() } - pub fn draw(&self, element_range: ElementRange) -> Result { - let server = self.state.upgrade().unwrap(); - - let (offset, count) = match element_range { - ElementRange::Full => (0, self.element_count.get()), - ElementRange::Specific { offset, count } => (offset, count), - }; - - let last_triangle_index = offset + count; - - if last_triangle_index > self.element_count.get() { - Err(FrameworkError::InvalidElementRange { - start: offset, - end: last_triangle_index, - total: self.element_count.get(), - }) - } else { - let index_per_element = self.element_kind.index_per_element(); - let start_index = offset * index_per_element; - let index_count = count * index_per_element; - - unsafe { - if index_count > 0 { - server.set_vertex_array_object(Some(self.vertex_array_object)); - - let indices = (start_index * size_of::()) as i32; - server.gl.draw_elements( - self.mode(), - index_count as i32, - glow::UNSIGNED_INT, - indices, - ); - } - } - - Ok(DrawCallStatistics { triangles: count }) - } - } - - fn mode(&self) -> u32 { + pub fn mode(&self) -> u32 { match self.element_kind { ElementKind::Triangle => glow::TRIANGLES, ElementKind::Line => glow::LINES, ElementKind::Point => glow::POINTS, } } - - pub fn draw_instances(&self, count: usize) -> DrawCallStatistics { - let server = self.state.upgrade().unwrap(); - - let index_per_element = self.element_kind.index_per_element(); - let index_count = self.element_count.get() * index_per_element; - if index_count > 0 { - unsafe { - server.set_vertex_array_object(Some(self.vertex_array_object)); - - server.gl.draw_elements_instanced( - self.mode(), - index_count as i32, - glow::UNSIGNED_INT, - 0, - count as i32, - ) - } - } - DrawCallStatistics { - triangles: self.element_count.get() * count, - } - } } impl Drop for GeometryBuffer { diff --git a/fyrox-graphics/src/gl/framebuffer.rs b/fyrox-graphics/src/gl/framebuffer.rs index 78e052752..badbc957d 100644 --- a/fyrox-graphics/src/gl/framebuffer.rs +++ b/fyrox-graphics/src/gl/framebuffer.rs @@ -318,7 +318,40 @@ impl FrameBuffer for GlFrameBuffer { pre_draw(self.id(), &server, viewport, program, params, resources); - geometry.draw(element_range) + let (offset, count) = match element_range { + ElementRange::Full => (0, geometry.element_count.get()), + ElementRange::Specific { offset, count } => (offset, count), + }; + + let last_triangle_index = offset + count; + + if last_triangle_index > geometry.element_count.get() { + Err(FrameworkError::InvalidElementRange { + start: offset, + end: last_triangle_index, + total: geometry.element_count.get(), + }) + } else { + let index_per_element = geometry.element_kind.index_per_element(); + let start_index = offset * index_per_element; + let index_count = count * index_per_element; + + unsafe { + if index_count > 0 { + server.set_vertex_array_object(Some(geometry.vertex_array_object)); + + let indices = (start_index * size_of::()) as i32; + server.gl.draw_elements( + geometry.mode(), + index_count as i32, + glow::UNSIGNED_INT, + indices, + ); + } + } + + Ok(DrawCallStatistics { triangles: count }) + } } fn draw_instances( @@ -334,7 +367,24 @@ impl FrameBuffer for GlFrameBuffer { pre_draw(self.id(), &server, viewport, program, params, resources); - geometry.draw_instances(count) + let index_per_element = geometry.element_kind.index_per_element(); + let index_count = geometry.element_count.get() * index_per_element; + if index_count > 0 { + unsafe { + server.set_vertex_array_object(Some(geometry.vertex_array_object)); + + server.gl.draw_elements_instanced( + geometry.mode(), + index_count as i32, + glow::UNSIGNED_INT, + 0, + count as i32, + ) + } + } + DrawCallStatistics { + triangles: geometry.element_count.get() * count, + } } }