/* * Blue Engine by Elham Aryanpur * * Basic GUI example * * Licensed under Apache-2.0 */ // EmbeddedRender enables rendering objects inside egui use blue_engine_egui::{egui, EmbeddedRender}; // Basic imports use blue_engine::{header::Engine, primitive_shapes::cube}; fn main() { // Initialize the engine with default settings let mut engine = Engine::new().expect("win"); // the object to display cube("cube", &mut engine.renderer, &mut engine.objects).expect("Couldn't create the cube"); // Start the egui context let mut gui_context = blue_engine_egui::EGUI::new(&engine.event_loop, &mut engine.renderer, &engine.window); // here we only need object temporarily let mut custom_rendering = { let mut object = engine.objects.get_mut("cube").unwrap(); // this will not render the object in the background object.is_visible = false; // create our instance of graphics EmbeddedRender::new(&mut object, &mut engine.renderer, &mut gui_context.renderer).unwrap() }; // We add the gui as plugin, which runs once before everything else to fetch events, and once during render times for rendering and other stuff engine.plugins.push(Box::new(gui_context)); let mut color = [1f32, 1f32, 1f32, 1f32]; let radius = 5f32; let start = std::time::SystemTime::now(); // Update loop engine .update_loop(move |renderer, window, objects, _, camera, plugins| { // obtain the plugin let egui_plugin = plugins[0] // downcast it to obtain the plugin .downcast_mut::() .expect("Plugin not found"); // Get our object let cube = objects.get_mut("cube").unwrap(); // and get current camera unifrom data let camera_data = camera.update_view_projection_and_return(renderer).unwrap(); // and prepare the data for our graphics custom_rendering.prepare(cube, renderer, &mut egui_plugin.renderer, camera_data); // ui function will provide the context egui_plugin.ui( |ctx| { // This window will contain our graphics egui::Window::new("title").resizable(true).show(ctx, |ui| { // We make a canvas to paint our graphics egui::Frame::canvas(ui.style()).show(ui, |ui| { // Paint our graphics custom_rendering.paint(ui); }); // to allocate space that is available after resize ui.allocate_space(ui.available_size()); }); // We can also do our other GUI stuff as always, egui::Window::new("Pick Color") .resizable(true) .show(ctx, |ui| { ui.horizontal(|ui| { ui.label("Pick a color"); ui.color_edit_button_rgba_unmultiplied(&mut color); }); }); }, &window, ); // we can normally apply changes to our graphics cube.set_uniform_color(color[0], color[1], color[2], color[3]) .unwrap(); // and even other settings let camx = start.elapsed().unwrap().as_secs_f32().sin() * radius; let camy = start.elapsed().unwrap().as_secs_f32().sin() * radius; let camz = start.elapsed().unwrap().as_secs_f32().cos() * radius; camera .set_position(camx, camy, camz) .expect("Couldn't update the camera eye"); }) .expect("Error during update loop"); }