1
1
use std:: cell:: Cell ;
2
- use std:: mem;
3
2
use std:: rc:: Rc ;
4
3
5
4
use glow:: { Context as GlowContext , HasContext , PixelUnpackData } ;
6
5
7
6
use crate :: error:: { Result , TetraError } ;
8
- use crate :: graphics:: mesh:: { BufferUsage , VertexWinding } ;
7
+ use crate :: graphics:: mesh:: { BufferUsage , Vertex , VertexWinding } ;
9
8
use crate :: graphics:: { BlendAlphaMode , BlendMode , FilterMode } ;
10
9
use crate :: math:: { Mat2 , Mat3 , Mat4 , Vec2 , Vec3 , Vec4 } ;
11
10
12
- /// Utility function for calculating offsets/sizes.
13
- fn size < T > ( elements : usize ) -> i32 {
14
- ( elements * mem:: size_of :: < T > ( ) ) as i32
15
- }
16
-
17
11
type BufferId = <GlowContext as HasContext >:: Buffer ;
18
12
type ProgramId = <GlowContext as HasContext >:: Program ;
19
13
type TextureId = <GlowContext as HasContext >:: Texture ;
@@ -149,7 +143,6 @@ impl GraphicsDevice {
149
143
pub fn new_vertex_buffer (
150
144
& mut self ,
151
145
count : usize ,
152
- stride : usize ,
153
146
usage : BufferUsage ,
154
147
) -> Result < RawVertexBuffer > {
155
148
unsafe {
@@ -163,16 +156,13 @@ impl GraphicsDevice {
163
156
state : Rc :: clone ( & self . state ) ,
164
157
id,
165
158
count,
166
- stride,
167
159
} ;
168
160
169
161
self . bind_vertex_buffer ( Some ( & buffer) ) ;
170
162
171
- self . state . gl . buffer_data_size (
172
- glow:: ARRAY_BUFFER ,
173
- size :: < f32 > ( buffer. size ( ) ) ,
174
- usage. into ( ) ,
175
- ) ;
163
+ self . state
164
+ . gl
165
+ . buffer_data_size ( glow:: ARRAY_BUFFER , buffer. size ( ) as i32 , usage. into ( ) ) ;
176
166
177
167
Ok ( buffer)
178
168
}
@@ -181,13 +171,13 @@ impl GraphicsDevice {
181
171
pub fn set_vertex_buffer_data (
182
172
& mut self ,
183
173
buffer : & RawVertexBuffer ,
184
- data : & [ f32 ] ,
174
+ data : & [ Vertex ] ,
185
175
offset : usize ,
186
176
) {
187
177
self . bind_vertex_buffer ( Some ( buffer) ) ;
188
178
189
179
assert ! (
190
- data. len( ) + offset <= buffer. size ( ) ,
180
+ data. len( ) + offset <= buffer. count ( ) ,
191
181
"tried to write out of bounds buffer data"
192
182
) ;
193
183
@@ -196,7 +186,7 @@ impl GraphicsDevice {
196
186
197
187
self . state . gl . buffer_sub_data_u8_slice (
198
188
glow:: ARRAY_BUFFER ,
199
- size :: < f32 > ( offset) ,
189
+ ( buffer . stride ( ) * offset) as i32 ,
200
190
bytemuck:: cast_slice ( data) ,
201
191
) ;
202
192
}
@@ -220,7 +210,7 @@ impl GraphicsDevice {
220
210
221
211
self . state . gl . buffer_data_size (
222
212
glow:: ELEMENT_ARRAY_BUFFER ,
223
- size :: < u32 > ( count ) ,
213
+ buffer . size ( ) as i32 ,
224
214
usage. into ( ) ,
225
215
) ;
226
216
@@ -241,7 +231,7 @@ impl GraphicsDevice {
241
231
242
232
self . state . gl . buffer_sub_data_u8_slice (
243
233
glow:: ELEMENT_ARRAY_BUFFER ,
244
- size :: < u32 > ( offset) ,
234
+ ( buffer . stride ( ) * offset) as i32 ,
245
235
bytemuck:: cast_slice ( data) ,
246
236
) ;
247
237
}
@@ -785,7 +775,7 @@ impl GraphicsDevice {
785
775
glow:: TRIANGLES ,
786
776
count as i32 ,
787
777
glow:: UNSIGNED_INT ,
788
- size :: < u32 > ( offset) ,
778
+ ( index_buffer . stride ( ) * offset) as i32 ,
789
779
) ;
790
780
}
791
781
}
@@ -806,7 +796,7 @@ impl GraphicsDevice {
806
796
2 ,
807
797
glow:: FLOAT ,
808
798
false ,
809
- size :: < f32 > ( b. stride ) ,
799
+ b. stride ( ) as i32 ,
810
800
0 ,
811
801
) ;
812
802
@@ -815,17 +805,17 @@ impl GraphicsDevice {
815
805
2 ,
816
806
glow:: FLOAT ,
817
807
false ,
818
- size :: < f32 > ( b. stride ) ,
819
- size :: < f32 > ( 2 ) ,
808
+ b. stride ( ) as i32 ,
809
+ 8 ,
820
810
) ;
821
811
822
812
self . state . gl . vertex_attrib_pointer_f32 (
823
813
2 ,
824
814
4 ,
825
815
glow:: FLOAT ,
826
816
false ,
827
- size :: < f32 > ( b. stride ) ,
828
- size :: < f32 > ( 4 ) ,
817
+ b. stride ( ) as i32 ,
818
+ 16 ,
829
819
) ;
830
820
831
821
self . state . gl . enable_vertex_attrib_array ( 0 ) ;
@@ -1056,20 +1046,22 @@ pub struct RawVertexBuffer {
1056
1046
id : BufferId ,
1057
1047
1058
1048
count : usize ,
1059
- stride : usize ,
1060
1049
}
1061
1050
1062
1051
impl RawVertexBuffer {
1052
+ /// The number of vertices in the buffer.
1063
1053
pub fn count ( & self ) -> usize {
1064
1054
self . count
1065
1055
}
1066
1056
1057
+ // The size of each vertex, in bytes.
1067
1058
pub fn stride ( & self ) -> usize {
1068
- self . stride
1059
+ std :: mem :: size_of :: < Vertex > ( )
1069
1060
}
1070
1061
1062
+ /// The size of the buffer, in bytes.
1071
1063
pub fn size ( & self ) -> usize {
1072
- self . count * self . stride
1064
+ self . count * self . stride ( )
1073
1065
}
1074
1066
}
1075
1067
@@ -1096,9 +1088,20 @@ pub struct RawIndexBuffer {
1096
1088
}
1097
1089
1098
1090
impl RawIndexBuffer {
1091
+ /// The number of indices in the buffer.
1099
1092
pub fn count ( & self ) -> usize {
1100
1093
self . count
1101
1094
}
1095
+
1096
+ /// The size of each index, in bytes.
1097
+ pub fn stride ( & self ) -> usize {
1098
+ std:: mem:: size_of :: < u32 > ( )
1099
+ }
1100
+
1101
+ /// The size of the buffer, in bytes.
1102
+ pub fn size ( & self ) -> usize {
1103
+ self . count * self . stride ( )
1104
+ }
1102
1105
}
1103
1106
1104
1107
impl Drop for RawIndexBuffer {
0 commit comments