diff --git a/imgui-gfx-renderer/src/lib.rs b/imgui-gfx-renderer/src/lib.rs index 7b9b717..97437cc 100644 --- a/imgui-gfx-renderer/src/lib.rs +++ b/imgui-gfx-renderer/src/lib.rs @@ -8,7 +8,7 @@ use gfx::texture::{FilterMethod, SamplerInfo, WrapMode}; use gfx::traits::FactoryExt; use gfx::{CommandBuffer, Encoder, Factory, IntoIndexBuffer, Rect, Resources, Slice}; use gfx::pso::{PipelineData, PipelineState}; -use imgui::{DrawList, FrameSize, ImDrawIdx, ImDrawVert, ImGui, Ui, Textures}; +use imgui::{DrawList, FrameSize, ImDrawIdx, ImDrawVert, ImGui, Ui, Textures, ImTexture}; pub type RendererResult = Result; @@ -18,6 +18,7 @@ pub enum RendererError { Buffer(gfx::buffer::CreationError), Pipeline(gfx::PipelineStateError), Combined(gfx::CombinedError), + BadTexture(ImTexture), } impl From> for RendererError { @@ -136,7 +137,6 @@ pub struct Renderer { bundle: Bundle>, index_buffer: Buffer, textures: Textures>, - backup_texture: Texture, } impl Renderer { @@ -175,7 +175,7 @@ impl Renderer { factory.create_sampler(SamplerInfo::new(FilterMethod::Trilinear, WrapMode::Clamp)); let pair = (texture, sampler); let mut textures = Textures::new(); - imgui.set_font_texture_id(textures.insert(pair.clone())); + imgui.set_font_texture_id(textures.insert(pair)); let slice = Slice { start: 0, @@ -193,7 +193,6 @@ impl Renderer { }, index_buffer: index_buffer, textures: textures, - backup_texture: pair, }) } @@ -254,7 +253,9 @@ impl Renderer { self.bundle.slice.start = 0; for cmd in draw_list.cmd_buffer { - let tex = self.textures.get(cmd.texture_id.into()).unwrap_or(&self.backup_texture); + let texture_id = cmd.texture_id.into(); + let tex = self.textures.get(texture_id) + .ok_or_else(|| RendererError::BadTexture(texture_id))?; self.bundle.slice.end = self.bundle.slice.start + cmd.elem_count; let scissor = Rect { diff --git a/imgui-glium-renderer/src/lib.rs b/imgui-glium-renderer/src/lib.rs index 6fe20a2..9091103 100644 --- a/imgui-glium-renderer/src/lib.rs +++ b/imgui-glium-renderer/src/lib.rs @@ -8,7 +8,7 @@ use glium::program; use glium::texture; use glium::vertex; use glium::{DrawError, IndexBuffer, Program, Surface, Texture2d, VertexBuffer}; -use imgui::{DrawList, FrameSize, ImDrawIdx, ImDrawVert, ImGui, Ui, Textures}; +use imgui::{DrawList, FrameSize, ImDrawIdx, ImDrawVert, ImGui, Ui, Textures, ImTexture}; use std::borrow::Cow; use std::fmt; use std::rc::Rc; @@ -22,6 +22,7 @@ pub enum RendererError { Program(program::ProgramChooserCreationError), Texture(texture::TextureCreationError), Draw(DrawError), + BadTexture(ImTexture), } impl fmt::Display for RendererError { @@ -33,6 +34,7 @@ impl fmt::Display for RendererError { Program(ref e) => write!(f, "Program creation failed: {}", e), Texture(_) => write!(f, "Texture creation failed"), Draw(ref e) => write!(f, "Drawing failed: {}", e), + BadTexture(ref t) => write!(f, "Bad texture ID: {}", t.id()), } } } @@ -134,15 +136,9 @@ impl Renderer { let mut idx_start = 0; for cmd in draw_list.cmd_buffer { - let texture = match self.device_objects.textures.get(cmd.texture_id.into()) { - Some(tex) => tex, - // if an invalid ID is supplied, fall back to the font - None => match self.device_objects.textures.get(0.into()) { - Some(tex) => tex, - // if the font is missing, which should never happen, skip - None => continue, - } - }; + let texture_id = cmd.texture_id.into(); + let texture = self.device_objects.textures.get(texture_id) + .ok_or_else(|| RendererError::BadTexture(texture_id))?; let idx_end = idx_start + cmd.elem_count as usize;