Skip to main content

dear_imgui_wgpu/renderer/
external_textures.rs

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