|
1 | 1 | use egui::PaintCallbackInfo; |
2 | 2 | use egui_wgpu::{CallbackResources, CallbackTrait}; |
3 | 3 |
|
4 | | -use crate::simulation::Particle; |
5 | | - |
6 | | -pub struct UnsafeParticleCallback { |
7 | | - pub render_pipeline_ptr: *const wgpu::RenderPipeline, |
8 | | - pub camera_bind_group_ptr: *const wgpu::BindGroup, |
9 | | - pub particle_buffer_ptr: *const wgpu::Buffer, |
10 | | -} |
11 | | - |
12 | | -// Safe because we ensure the pointers remain valid during the callback's lifetime |
13 | | -// and we're only reading from them |
14 | | -unsafe impl Send for UnsafeParticleCallback {} |
15 | | -unsafe impl Sync for UnsafeParticleCallback {} |
16 | | - |
17 | | -impl CallbackTrait for UnsafeParticleCallback { |
18 | | - fn prepare( |
19 | | - &self, |
20 | | - _device: &wgpu::Device, |
21 | | - _queue: &wgpu::Queue, |
22 | | - _screen_descriptor: &egui_wgpu::ScreenDescriptor, |
23 | | - _encoder: &mut wgpu::CommandEncoder, |
24 | | - _callback_resources: &mut CallbackResources, |
25 | | - ) -> Vec<wgpu::CommandBuffer> { |
26 | | - Vec::new() |
27 | | - } |
28 | | - |
29 | | - fn paint( |
30 | | - &self, |
31 | | - _info: PaintCallbackInfo, |
32 | | - render_pass: &mut wgpu::RenderPass<'static>, |
33 | | - _callback_resources: &CallbackResources, |
34 | | - ) { |
35 | | - unsafe { |
36 | | - // Dereference the pointers - safe because we ensure they remain valid |
37 | | - let render_pipeline = &*self.render_pipeline_ptr; |
38 | | - let camera_bind_group = &*self.camera_bind_group_ptr; |
39 | | - let particle_buffer = &*self.particle_buffer_ptr; |
40 | | - |
41 | | - let particle_struct_size = std::mem::size_of::<Particle>() as u64; |
42 | | - // Ensure particle_struct_size is not zero to avoid division by zero |
43 | | - let actual_drawable_particles = if particle_struct_size > 0 { |
44 | | - particle_buffer.size() / particle_struct_size |
45 | | - } else { |
46 | | - 0 // Or handle error appropriately |
47 | | - }; |
48 | | - |
49 | | - render_pass.set_pipeline(render_pipeline); |
50 | | - render_pass.set_bind_group(0, camera_bind_group, &[]); |
51 | | - render_pass.set_vertex_buffer(0, particle_buffer.slice(..)); |
52 | | - render_pass.draw(0..1, 0..actual_drawable_particles as u32); |
53 | | - } |
54 | | - } |
55 | | -} |
56 | | - |
57 | | -// A callback for particle rendering using cloned resources |
58 | 4 | pub struct ClonedParticleCallback { |
59 | 5 | pub render_pipeline: wgpu::RenderPipeline, |
60 | 6 | pub camera_bind_group: wgpu::BindGroup, |
|
0 commit comments