fyrox_impl/renderer/framework/
mod.rs1use crate::{
24 renderer::framework::{
25 buffer::BufferUsage,
26 error::FrameworkError,
27 geometry_buffer::{
28 AttributeDefinition, AttributeKind, GeometryBuffer, GeometryBufferDescriptor,
29 VertexBufferData, VertexBufferDescriptor,
30 },
31 server::GraphicsServer,
32 },
33 scene::mesh::{buffer::VertexAttributeDataType, surface::SurfaceData},
34};
35use fyrox_graphics::geometry_buffer::ElementsDescriptor;
36pub use fyrox_graphics::*;
37
38pub trait GeometryBufferExt {
40 fn from_surface_data(
42 data: &SurfaceData,
43 usage: BufferUsage,
44 server: &dyn GraphicsServer,
45 ) -> Result<Box<dyn GeometryBuffer>, FrameworkError>;
46}
47
48impl GeometryBufferExt for dyn GeometryBuffer {
49 fn from_surface_data(
50 data: &SurfaceData,
51 usage: BufferUsage,
52 server: &dyn GraphicsServer,
53 ) -> Result<Box<dyn GeometryBuffer>, FrameworkError> {
54 let attributes = data
55 .vertex_buffer
56 .layout()
57 .iter()
58 .map(|a| AttributeDefinition {
59 location: a.shader_location as u32,
60 kind: match a.data_type {
61 VertexAttributeDataType::F32 => AttributeKind::Float,
62 VertexAttributeDataType::U32 => AttributeKind::UnsignedInt,
63 VertexAttributeDataType::U16 => AttributeKind::UnsignedShort,
64 VertexAttributeDataType::U8 => AttributeKind::UnsignedByte,
65 },
66 component_count: a.size as usize,
67 normalized: a.normalized,
68 divisor: a.divisor as u32,
69 })
70 .collect::<Vec<_>>();
71
72 let geometry_buffer_desc = GeometryBufferDescriptor {
73 buffers: &[VertexBufferDescriptor {
74 usage,
75 attributes: &attributes,
76 data: VertexBufferData {
77 element_size: data.vertex_buffer.vertex_size() as usize,
78 bytes: Some(data.vertex_buffer.raw_data()),
79 },
80 }],
81 usage,
82 elements: ElementsDescriptor::Triangles(data.geometry_buffer.triangles_ref()),
83 };
84
85 server.create_geometry_buffer(geometry_buffer_desc)
86 }
87}