use std::fs::File; use std::io::Cursor; use std::sync::Mutex; use hudhook::*; use image::io::Reader as ImageReader; use image::{EncodableLayout, RgbaImage}; use imgui::{Condition, Image, TextureId}; use tracing_subscriber::prelude::*; use tracing_subscriber::{fmt, EnvFilter}; pub fn setup_tracing() { hudhook::alloc_console().unwrap(); hudhook::enable_console_colors(); dotenv::dotenv().ok(); std::env::set_var("RUST_LOG", "trace"); let log_file = hudhook::util::get_dll_path() .map(|mut path| { path.set_extension("log"); path }) .and_then(|path| File::create(path).ok()) .unwrap(); tracing_subscriber::registry() .with( fmt::layer().event_format( fmt::format() .with_level(true) .with_thread_ids(true) .with_file(true) .with_line_number(true) .with_thread_names(true), ), ) .with( fmt::layer() .with_thread_ids(true) .with_file(true) .with_line_number(true) .with_thread_names(true) .with_writer(Mutex::new(log_file)) .with_ansi(false) .boxed(), ) .with(EnvFilter::from_default_env()) .init(); } pub struct HookExample { open: bool, image: RgbaImage, image_id: Option, } impl HookExample { pub fn new() -> Self { let image = ImageReader::new(Cursor::new(include_bytes!("../../tests/thingken.webp"))) .with_guessed_format() .unwrap() .decode() .unwrap() .into_rgba8(); Self { open: true, image, image_id: None } } } impl ImguiRenderLoop for HookExample { fn initialize<'a>( &'a mut self, _ctx: &mut imgui::Context, render_context: &'a mut dyn RenderContext, ) { let tex_id = render_context .load_texture(self.image.as_bytes(), self.image.width(), self.image.height()) .unwrap(); self.image_id = Some(tex_id); } fn render(&mut self, ui: &mut imgui::Ui) { ui.window("Image") .size([192.0, 192.0], Condition::FirstUseEver) .position([16.0, 16.0], Condition::FirstUseEver) .build(|| { Image::new(self.image_id.unwrap(), [ self.image.width() as f32, self.image.height() as f32, ]) .build(ui); }); ui.show_demo_window(&mut self.open); ui.show_metrics_window(&mut self.open); } }