dear_imgui_wgpu/renderer/
external_textures.rs

1// Renderer external texture helpers (register/update/unregister)
2
3use super::WgpuRenderer;
4
5impl WgpuRenderer {
6    /// Register an external WGPU texture + view and obtain a TextureId for ImGui usage.
7    ///
8    /// Use this when you already have a `wgpu::Texture` (e.g., game view RT, video frame,
9    /// atlas upload) and want to display it via legacy `TextureId` path:
10    /// `ui.image(TextureId::from(id), size)`.
11    pub fn register_external_texture(
12        &mut self,
13        texture: &wgpu::Texture,
14        view: &wgpu::TextureView,
15    ) -> u64 {
16        self.texture_manager
17            .register_texture(crate::WgpuTexture::new(texture.clone(), view.clone()))
18    }
19
20    /// Register an external WGPU texture + view with a custom sampler.
21    ///
22    /// This lets you control sampling (e.g. nearest vs linear) per external texture.
23    /// The sampler must be a filtering sampler compatible with the ImGui pipeline.
24    pub fn register_external_texture_with_sampler(
25        &mut self,
26        texture: &wgpu::Texture,
27        view: &wgpu::TextureView,
28        sampler: &wgpu::Sampler,
29    ) -> u64 {
30        let id = self
31            .texture_manager
32            .register_texture(crate::WgpuTexture::new(texture.clone(), view.clone()));
33        self.texture_manager
34            .set_custom_sampler_for_texture(id, sampler.clone());
35        id
36    }
37
38    /// Update the view for an already-registered external texture.
39    ///
40    /// Returns true if the texture existed and the view was replaced.
41    pub fn update_external_texture_view(
42        &mut self,
43        texture_id: u64,
44        view: &wgpu::TextureView,
45    ) -> bool {
46        if let Some(mut tex) = self.texture_manager.remove_texture(texture_id) {
47            tex.texture_view = view.clone();
48            self.texture_manager.insert_texture_with_id(texture_id, tex);
49            if let Some(backend) = self.backend_data.as_mut() {
50                backend.render_resources.remove_image_bind_group(texture_id);
51            }
52            true
53        } else {
54            false
55        }
56    }
57
58    /// Update (or set) a custom sampler for an already-registered external texture.
59    ///
60    /// Returns false if the texture_id is not registered.
61    pub fn update_external_texture_sampler(
62        &mut self,
63        texture_id: u64,
64        sampler: &wgpu::Sampler,
65    ) -> bool {
66        self.texture_manager
67            .update_custom_sampler_for_texture(texture_id, sampler.clone())
68    }
69
70    /// Unregister (remove) a texture by id. Safe for both external and managed textures.
71    pub fn unregister_texture(&mut self, texture_id: u64) {
72        self.texture_manager.remove_texture(texture_id);
73        self.texture_manager
74            .clear_custom_sampler_for_texture(texture_id);
75        if let Some(backend) = self.backend_data.as_mut() {
76            backend.render_resources.remove_image_bind_group(texture_id);
77        }
78    }
79}