Skip to content

Commit 57578bf

Browse files
committed
imgui_gfx_renderer: Support custom textures
1 parent f13309d commit 57578bf

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

imgui-gfx-renderer/src/lib.rs

+18-4
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ extern crate gfx;
33
extern crate imgui;
44

55
mod im_texture;
6+
pub use im_texture::Texture;
7+
8+
use std::ops::Deref;
69

710
use gfx::handle::{Buffer, RenderTargetView};
811
use gfx::memory::Bind;
912
use gfx::texture::{FilterMethod, SamplerInfo, WrapMode};
1013
use gfx::traits::FactoryExt;
1114
use gfx::{Bundle, CommandBuffer, Encoder, Factory, IntoIndexBuffer, Rect, Resources, Slice};
12-
use imgui::{DrawList, FrameSize, ImDrawIdx, ImDrawVert, ImGui, Ui};
15+
use imgui::{DrawList, FrameSize, FromImTexture, ImDrawIdx, ImDrawVert, ImGui, Ui};
1316

1417
pub type RendererResult<T> = Result<T, RendererError>;
1518

@@ -99,8 +102,11 @@ impl Shaders {
99102
pub struct Renderer<R: Resources> {
100103
bundle: Bundle<R, pipe::Data<R>>,
101104
index_buffer: Buffer<R, u16>,
105+
font_texture: gfx::handle::ShaderResourceView<R, [f32; 4]>,
102106
}
103107

108+
const FONT_TEXTURE_ID: usize = 0;
109+
104110
impl<R: Resources> Renderer<R> {
105111
pub fn init<F: Factory<R>>(
106112
imgui: &mut ImGui,
@@ -133,7 +139,8 @@ impl<R: Resources> Renderer<R> {
133139
&[handle.pixels],
134140
)
135141
})?;
136-
// TODO: set texture id in imgui
142+
imgui.set_texture_id(FONT_TEXTURE_ID);
143+
137144
let sampler =
138145
factory.create_sampler(SamplerInfo::new(FilterMethod::Trilinear, WrapMode::Clamp));
139146
let data = pipe::Data {
@@ -144,7 +151,7 @@ impl<R: Resources> Renderer<R> {
144151
[0.0, 0.0, -1.0, 0.0],
145152
[-1.0, 1.0, 0.0, 1.0],
146153
],
147-
tex: (texture, sampler),
154+
tex: (texture.clone(), sampler),
148155
out: out,
149156
scissor: Rect {
150157
x: 0,
@@ -163,6 +170,7 @@ impl<R: Resources> Renderer<R> {
163170
Ok(Renderer {
164171
bundle: Bundle::new(slice, pso, data),
165172
index_buffer: index_buffer,
173+
font_texture: texture,
166174
})
167175
}
168176
pub fn update_render_target(&mut self, out: RenderTargetView<R, gfx::format::Rgba8>) {
@@ -216,7 +224,13 @@ impl<R: Resources> Renderer<R> {
216224

217225
self.bundle.slice.start = 0;
218226
for cmd in draw_list.cmd_buffer {
219-
// TODO: check cmd.texture_id
227+
self.bundle.data.tex.0 = if cmd.texture_id as usize == FONT_TEXTURE_ID {
228+
self.font_texture.clone()
229+
} else {
230+
<Texture<R> as FromImTexture>::from_id(cmd.texture_id)
231+
.deref()
232+
.clone()
233+
};
220234

221235
self.bundle.slice.end = self.bundle.slice.start + cmd.elem_count;
222236
self.bundle.data.scissor = Rect {

0 commit comments

Comments
 (0)