11use super :: push_constants:: PushConstants ;
22use super :: vertex:: UIVertex ;
33use crate :: error:: Error ;
4- use egui:: epaint:: { ImageDelta , Primitive } ;
4+ use egui:: epaint:: { ImageDelta , Primitive , Vertex } ;
55use egui:: { ClippedPrimitive , ImageData , Rect , TextureId , TexturesDelta } ;
66use log:: trace;
77use nalgebra_glm:: Mat4 ;
@@ -20,6 +20,20 @@ struct MeshDrawInfo {
2020 pub rect : Rect ,
2121}
2222
23+ impl Default for MeshDrawInfo {
24+ fn default ( ) -> Self {
25+ Self {
26+ tex_id : TextureId :: default ( ) ,
27+ indices_count : 0 ,
28+ vertices_count : 0 ,
29+ rect : Rect {
30+ min : egui:: Pos2 { x : 0.0 , y : 0.0 } ,
31+ max : egui:: Pos2 { x : 0.0 , y : 0.0 } ,
32+ } ,
33+ }
34+ }
35+ }
36+
2337pub ( crate ) struct EguiRenderer {
2438 index_buffers : Vec < VMABuffer > ,
2539 vertex_buffers : Vec < VMABuffer > ,
@@ -32,6 +46,7 @@ pub(crate) struct EguiRenderer {
3246
3347 images : HashMap < TextureId , ( VMAImage , DescriptorSet ) > ,
3448 mesh_draw_infos : Vec < MeshDrawInfo > ,
49+ mesh_draw_count : usize ,
3550}
3651
3752impl EguiRenderer {
@@ -161,7 +176,7 @@ impl EguiRenderer {
161176 . unwrap ( ) ;
162177
163178 let images = HashMap :: new ( ) ;
164- let mesh_draw_infos = Vec :: new ( ) ;
179+ let mesh_draw_infos = vec ! [ MeshDrawInfo :: default ( ) ; 1024 ] ;
165180
166181 Ok ( Self {
167182 index_buffers,
@@ -172,6 +187,7 @@ impl EguiRenderer {
172187 sampler,
173188 images,
174189 mesh_draw_infos,
190+ mesh_draw_count : 0 ,
175191 } )
176192 }
177193
@@ -214,11 +230,14 @@ impl EguiRenderer {
214230 self . update_image ( vk_init, & delta. 0 , & delta. 1 , cmd_buffer) ?;
215231 }
216232
217- let mut indices = Vec :: new ( ) ;
218- let mut vertices = Vec :: new ( ) ;
219- let mut mesh_draw_infos = Vec :: new ( ) ;
233+ let index_buffer = & self . index_buffers [ frame] ;
234+ let vertex_buffer = & self . vertex_buffers [ frame] ;
220235
221236 {
237+ let mut indices_count = 0 ;
238+ let mut vertices_count = 0 ;
239+ let mut draw_infos_count = 0 ;
240+
222241 profiling:: scope!( "EguiRenderer::Input::DataIterator" ) ;
223242 for clip in clipped_primitives. into_iter ( ) {
224243 let Primitive :: Mesh ( mesh) = clip. primitive else {
@@ -232,19 +251,25 @@ impl EguiRenderer {
232251 rect : clip. clip_rect ,
233252 } ;
234253
235- indices. extend ( mesh. indices ) ;
236- vertices. extend ( mesh. vertices ) ;
237- mesh_draw_infos. push ( mesh_draw_info) ;
254+ unsafe {
255+ let ptr = index_buffer. allocation_info . mapped_data as * mut u32 ;
256+ let ptr = ptr. add ( indices_count) ;
257+ ptr. copy_from_nonoverlapping ( mesh. indices . as_ptr ( ) , mesh. indices . len ( ) ) ;
258+ }
259+ unsafe {
260+ let ptr = vertex_buffer. allocation_info . mapped_data as * mut Vertex ;
261+ let ptr = ptr. add ( vertices_count) ;
262+ ptr. copy_from_nonoverlapping ( mesh. vertices . as_ptr ( ) , mesh. vertices . len ( ) ) ;
263+ }
264+
265+ self . mesh_draw_infos [ draw_infos_count] = mesh_draw_info;
266+
267+ indices_count += mesh. indices . len ( ) ;
268+ vertices_count += mesh. vertices . len ( ) ;
269+ draw_infos_count += 1 ;
238270 }
239- }
240271
241- {
242- profiling:: scope!( "EguiRenderer::Input::SetData" ) ;
243- let index_buffer = & self . index_buffers [ frame] ;
244- let vertex_buffer = & self . vertex_buffers [ frame] ;
245- self . mesh_draw_infos = mesh_draw_infos;
246- index_buffer. set_data ( & indices) ?;
247- vertex_buffer. set_data ( & vertices) ?;
272+ self . mesh_draw_count = draw_infos_count;
248273 }
249274
250275 Ok ( ( ) )
@@ -320,7 +345,7 @@ impl EguiRenderer {
320345 let mut index_offset = 0 ;
321346 let mut vertex_offset = 0 ;
322347
323- for info in self . mesh_draw_infos . iter ( ) {
348+ for info in & self . mesh_draw_infos [ 0 .. self . mesh_draw_count ] {
324349 let ( _, desc_set) = self
325350 . images
326351 . get ( & info. tex_id )
0 commit comments