1mod internal {
4 pub use lambda_platform::gfx::buffer::{
7 Buffer,
8 BufferBuilder,
9 };
10}
11
12use std::rc::Rc;
13
14pub use lambda_platform::gfx::buffer::{
16 BufferType,
17 Properties,
18 Usage,
19};
20use logging;
21
22use super::{
23 mesh::Mesh,
24 vertex::Vertex,
25 RenderContext,
26};
27
28#[derive(Debug)]
30pub struct Buffer {
31 buffer: Rc<internal::Buffer<super::internal::RenderBackend>>,
32 buffer_type: BufferType,
33}
34
35impl Buffer {
37 pub fn destroy(self, render_context: &RenderContext) {
40 Rc::try_unwrap(self.buffer)
41 .expect("Failed to get inside buffer")
42 .destroy(render_context.internal_gpu());
43 }
44}
45
46impl Buffer {
48 pub(super) fn internal_buffer_rc(
50 &self,
51 ) -> Rc<internal::Buffer<super::internal::RenderBackend>> {
52 return self.buffer.clone();
53 }
54
55 pub(super) fn internal_buffer(
56 &self,
57 ) -> &internal::Buffer<super::internal::RenderBackend> {
58 return &self.buffer;
59 }
60}
61
62pub struct BufferBuilder {
66 buffer_builder: internal::BufferBuilder,
67 buffer_type: BufferType,
68}
69
70impl BufferBuilder {
71 pub fn new() -> Self {
73 return Self {
74 buffer_builder: internal::BufferBuilder::new(),
75 buffer_type: BufferType::Vertex,
76 };
77 }
78
79 pub fn build_from_mesh(
81 mesh: &Mesh,
82 render_context: &mut RenderContext,
83 ) -> Result<Buffer, &'static str> {
84 let mut buffer_builder = Self::new();
85
86 let internal_buffer = buffer_builder
88 .buffer_builder
89 .with_length(mesh.vertices().len() * std::mem::size_of::<Vertex>())
90 .with_usage(Usage::VERTEX)
91 .with_properties(Properties::CPU_VISIBLE)
92 .build(
93 render_context.internal_mutable_gpu(),
94 mesh.vertices().to_vec(),
95 );
96
97 match internal_buffer {
98 Ok(internal_buffer) => {
99 return Ok(Buffer {
100 buffer: Rc::new(internal_buffer),
101 buffer_type: BufferType::Vertex,
102 });
103 }
104 Err(_) => {
105 return Err("Failed to create buffer from mesh.");
106 }
107 }
108 }
109
110 pub fn with_length(&mut self, size: usize) -> &mut Self {
112 self.buffer_builder.with_length(size);
113 return self;
114 }
115
116 pub fn with_buffer_type(&mut self, buffer_type: BufferType) -> &mut Self {
118 self.buffer_type = buffer_type;
119 self.buffer_builder.with_buffer_type(buffer_type);
120 return self;
121 }
122
123 pub fn with_usage(&mut self, usage: Usage) -> &mut Self {
125 self.buffer_builder.with_usage(usage);
126 return self;
127 }
128
129 pub fn with_properties(&mut self, properties: Properties) -> &mut Self {
131 self.buffer_builder.with_properties(properties);
132 return self;
133 }
134
135 pub fn build<Data: Sized>(
137 &self,
138 render_context: &mut RenderContext,
139 data: Vec<Data>,
140 ) -> Result<Buffer, &'static str> {
141 let buffer_allocation = self
142 .buffer_builder
143 .build(render_context.internal_mutable_gpu(), data);
144
145 match buffer_allocation {
146 Ok(buffer) => {
147 logging::debug!(
148 "Buffer allocation for {:?} succeeded.",
149 self.buffer_type
150 );
151 return Ok(Buffer {
152 buffer: Rc::new(buffer),
153 buffer_type: self.buffer_type,
154 });
155 }
156 Err(error) => {
157 logging::error!(
158 "Buffer allocation for {:?} failed with error: {:?}",
159 self.buffer_type,
160 error
161 );
162 return Err(error);
163 }
164 }
165 }
166}