mod3d_base/
buffer_data_accessor.rs1use std::cell::RefCell;
3
4use crate::{BufferDescriptor, BufferElementType, Renderable, VertexAttr, VertexDesc};
5
6pub struct BufferDataAccessor<'a, R: Renderable> {
14 desc: &'a BufferDescriptor<'a, R>,
16
17 desc_index: u8,
19
20 rc_client: RefCell<R::DataAccessor>,
27}
28
29impl<'a, R: Renderable> std::fmt::Debug for BufferDataAccessor<'a, R>
31where
32 R: Renderable,
33{
34 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
35 write!(
36 fmt,
37 "BufferDataAccessor{{{:?}}}",
38 self.desc.element(self.desc_index as usize),
39 )
40 }
41}
42
43impl<'a, R: Renderable> BufferDataAccessor<'a, R> {
45 pub fn new(desc: &'a BufferDescriptor<'a, R>, desc_index: u8) -> Self {
48 let rc_client = RefCell::new(R::DataAccessor::default());
49 Self {
50 desc,
51 desc_index,
52 rc_client,
53 }
54 }
55
56 pub fn create_client(&self, renderable: &mut R) {
59 use std::ops::DerefMut;
60 renderable.init_data_accessor_client(self.rc_client.borrow_mut().deref_mut(), self);
61 }
62
63 pub fn borrow_client(&self) -> std::cell::Ref<R::DataAccessor> {
66 self.rc_client.borrow()
67 }
68
69 pub fn desc_index(&self) -> u8 {
72 self.desc_index
73 }
74
75 pub fn desc(&self) -> &BufferDescriptor<'a, R> {
78 &self.desc
79 }
80
81 #[inline]
84 pub fn vertex_desc(&self) -> &VertexDesc {
85 self.desc.element(self.desc_index as usize)
86 }
87
88 #[inline]
91 pub fn vertex_attr(&self) -> VertexAttr {
92 self.vertex_desc().vertex_attr()
93 }
94
95 #[inline]
98 pub fn byte_offset(&self) -> u32 {
99 self.vertex_desc().byte_offset() as u32 + self.desc.byte_offset()
100 }
101
102 #[inline]
105 pub fn ele_type(&self) -> BufferElementType {
106 self.vertex_desc().ele_type()
107 }
108
109 #[inline]
112 pub fn count(&self) -> u32 {
113 self.vertex_desc().count()
114 }
115
116 pub fn byte_length(&self) -> u32 {
119 self.vertex_desc().byte_length()
120 }
121
122 }
124
125impl<'a, R: Renderable> std::fmt::Display for BufferDataAccessor<'a, R> {
127 fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
128 <Self as std::fmt::Debug>::fmt(self, f)
129 }
130}
131
132impl<'a, R: Renderable> indent_display::DefaultIndentedDisplay for BufferDataAccessor<'a, R> {}