mod3d_base/
buffer_index_accessor.rs1use std::cell::RefCell;
3use std::ops::DerefMut;
4
5use crate::{BufferData, BufferElementType, Renderable};
6
7pub struct BufferIndexAccessor<'a, R: Renderable> {
15 data: &'a BufferData<'a, R>,
17
18 number_indices: u32,
20
21 ele_type: BufferElementType,
25
26 byte_offset: u32,
28
29 rc_client: RefCell<R::IndexAccessor>,
36}
37
38impl<'a, R: Renderable> std::fmt::Debug for BufferIndexAccessor<'a, R>
40where
41 R: Renderable,
42{
43 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
44 write!(
45 fmt,
46 "BufferIndexAccessor{{ {:?}:{:?} #{}@{}}}",
47 self.data,
48 self.ele_type,
49 self.number_indices,
50 self.byte_offset,
51 )
53 }
54}
55
56impl<'a, R> AsRef<[u8]> for BufferIndexAccessor<'a, R>
58where
59 R: Renderable,
60{
61 fn as_ref(&self) -> &[u8] {
62 let data: &[u8] = self.data.as_ref();
63 let start = self.byte_offset as usize;
64 let byte_length = self.number_indices * self.ele_type.byte_length();
65 let end = (self.byte_offset + byte_length) as usize;
66 &data[start..end]
67 }
68}
69
70impl<'a, R: Renderable> BufferIndexAccessor<'a, R> {
72 pub fn data(&self) -> &BufferData<'a, R> {
75 self.data
76 }
77
78 pub fn number_indices(&self) -> u32 {
81 self.number_indices
82 }
83
84 pub fn ele_type(&self) -> BufferElementType {
89 self.ele_type
90 }
91
92 pub fn byte_offset(&self) -> u32 {
95 self.byte_offset
96 }
97
98 pub fn new(
101 data: &'a BufferData<'a, R>,
102 number_indices: u32,
103 ele_type: BufferElementType,
104 byte_offset: u32, ) -> Self {
106 let rc_client = RefCell::new(R::IndexAccessor::default());
107 Self {
108 data,
109 number_indices,
110 ele_type,
111 byte_offset,
112 rc_client,
113 }
114 }
115
116 pub fn create_client(&self, renderable: &mut R) {
119 renderable.init_index_accessor_client(self.rc_client.borrow_mut().deref_mut(), self);
120 }
121
122 pub fn borrow_client(&self) -> std::cell::Ref<R::IndexAccessor> {
125 self.rc_client.borrow()
126 }
127
128 }
130
131impl<'a, R: Renderable> std::fmt::Display for BufferIndexAccessor<'a, R> {
133 fn fmt(&self, fmt: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
134 std::fmt::Debug::fmt(self, fmt)
135 }
136}
137
138impl<'a, R: Renderable> indent_display::DefaultIndentedDisplay for BufferIndexAccessor<'a, R> {}