use crate::{
graphics::{
buffer::BufferUsage,
error::FrameworkError,
geometry_buffer::{
AttributeDefinition, AttributeKind, GpuGeometryBufferDescriptor, VertexBufferData,
VertexBufferDescriptor,
},
server::GraphicsServer,
},
scene::mesh::{buffer::VertexAttributeDataType, surface::SurfaceData},
};
use fyrox_graphics::geometry_buffer::{ElementsDescriptor, GpuGeometryBuffer};
pub trait GeometryBufferExt {
fn from_surface_data(
name: &str,
data: &SurfaceData,
usage: BufferUsage,
server: &dyn GraphicsServer,
) -> Result<GpuGeometryBuffer, FrameworkError>;
}
impl GeometryBufferExt for GpuGeometryBuffer {
fn from_surface_data(
name: &str,
data: &SurfaceData,
usage: BufferUsage,
server: &dyn GraphicsServer,
) -> Result<GpuGeometryBuffer, FrameworkError> {
let attributes = data
.vertex_buffer
.layout()
.iter()
.map(|a| AttributeDefinition {
location: a.shader_location as u32,
kind: match a.data_type {
VertexAttributeDataType::F32 => AttributeKind::Float,
VertexAttributeDataType::U32 => AttributeKind::UnsignedInt,
VertexAttributeDataType::U16 => AttributeKind::UnsignedShort,
VertexAttributeDataType::U8 => AttributeKind::UnsignedByte,
},
component_count: a.size as usize,
normalized: a.normalized,
divisor: a.divisor as u32,
})
.collect::<Vec<_>>();
let geometry_buffer_desc = GpuGeometryBufferDescriptor {
name,
buffers: &[VertexBufferDescriptor {
usage,
attributes: &attributes,
data: VertexBufferData {
element_size: data.vertex_buffer.vertex_size() as usize,
bytes: Some(data.vertex_buffer.raw_data()),
},
}],
usage,
elements: ElementsDescriptor::Triangles(data.geometry_buffer.triangles_ref()),
};
server.create_geometry_buffer(geometry_buffer_desc)
}
}