From 636a39cbe122ce91ea554920ee7aa4475d8f2de7 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Wed, 8 Feb 2023 17:16:44 +0100 Subject: [PATCH] Update `glow` to 0.12 (#2695) * Remove three-d example due to glow incompatibility * Update to glow 0.12 * Remove three-d from deny.toml * Add line to changelog --- Cargo.lock | 111 +---------- crates/eframe/Cargo.toml | 2 +- crates/egui_glow/CHANGELOG.md | 1 + crates/egui_glow/Cargo.toml | 4 +- deny.toml | 1 - examples/custom_3d_glow/Cargo.toml | 2 +- examples/custom_3d_three-d/Cargo.toml | 24 --- examples/custom_3d_three-d/README.md | 22 --- examples/custom_3d_three-d/index.html | 38 ---- examples/custom_3d_three-d/screenshot.png | Bin 52939 -> 0 bytes examples/custom_3d_three-d/src/lib.rs | 21 -- examples/custom_3d_three-d/src/main.rs | 231 ---------------------- 12 files changed, 9 insertions(+), 448 deletions(-) delete mode 100644 examples/custom_3d_three-d/Cargo.toml delete mode 100644 examples/custom_3d_three-d/README.md delete mode 100644 examples/custom_3d_three-d/index.html delete mode 100644 examples/custom_3d_three-d/screenshot.png delete mode 100644 examples/custom_3d_three-d/src/lib.rs delete mode 100644 examples/custom_3d_three-d/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 630a7a63..fdcd1c0c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -188,15 +188,6 @@ version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" -[[package]] -name = "approx" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278" -dependencies = [ - "num-traits", -] - [[package]] name = "arboard" version = "3.2.0" @@ -625,16 +616,6 @@ dependencies = [ "libc", ] -[[package]] -name = "cgmath" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a98d30140e3296250832bbaaff83b27dcd6fa3cc70fb6f1f3e5c9c0023b5317" -dependencies = [ - "approx", - "num-traits", -] - [[package]] name = "chrono" version = "0.4.23" @@ -955,20 +936,7 @@ version = "0.1.0" dependencies = [ "eframe", "egui_glow", - "glow 0.11.2", -] - -[[package]] -name = "custom_3d_three-d" -version = "0.1.0" -dependencies = [ - "console_error_panic_hook", - "eframe", - "egui_glow", - "glow 0.11.2", - "three-d", - "wasm-bindgen", - "wasm-bindgen-futures", + "glow", ] [[package]] @@ -1276,7 +1244,7 @@ dependencies = [ "egui-wgpu", "egui-winit", "egui_glow", - "glow 0.11.2", + "glow", "glutin", "glutin-winit", "image", @@ -1403,7 +1371,7 @@ dependencies = [ "document-features", "egui", "egui-winit", - "glow 0.11.2", + "glow", "glutin", "glutin-winit", "memoffset", @@ -1772,18 +1740,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" -[[package]] -name = "glow" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8bd5877156a19b8ac83a29b2306fe20537429d318f3ff0a1a2119f8d9c61919" -dependencies = [ - "js-sys", - "slotmap", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "glow" version = "0.12.0" @@ -1946,10 +1902,6 @@ name = "half" version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" -dependencies = [ - "num-traits", - "zerocopy", -] [[package]] name = "hashbrown" @@ -2221,12 +2173,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "libm" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" - [[package]] name = "line-wrap" version = "0.1.1" @@ -2523,7 +2469,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", - "libm", ] [[package]] @@ -3585,33 +3530,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "three-d" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7a5a1017829335f6761bdbae2daf3021a88314a1f8d5f188c9b62ce62e2fd31" -dependencies = [ - "cgmath", - "glow 0.11.2", - "instant", - "thiserror", - "three-d-asset", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "three-d-asset" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e953f34aa4169e098621a1ff23a68c47b7798711f7c769bf741248e850e93fbe" -dependencies = [ - "cgmath", - "half", - "thiserror", - "web-sys", -] - [[package]] name = "time" version = "0.1.45" @@ -4274,7 +4192,7 @@ dependencies = [ "d3d12", "foreign-types", "fxhash", - "glow 0.12.0", + "glow", "gpu-alloc", "gpu-allocator", "gpu-descriptor", @@ -4747,27 +4665,6 @@ dependencies = [ "zvariant", ] -[[package]] -name = "zerocopy" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "332f188cc1bcf1fe1064b8c58d150f497e697f49774aa846f2dc949d9a25f236" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6505e6815af7de1746a08f69c69606bb45695a17149517680f3b2149713b19a3" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "zstd" version = "0.11.2+zstd.1.5.2" diff --git a/crates/eframe/Cargo.toml b/crates/eframe/Cargo.toml index 48464a2c..52a4b266 100644 --- a/crates/eframe/Cargo.toml +++ b/crates/eframe/Cargo.toml @@ -80,7 +80,7 @@ tracing = { version = "0.1", default-features = false, features = ["std"] } document-features = { version = "0.2", optional = true } egui_glow = { version = "0.20.0", path = "../egui_glow", optional = true, default-features = false } -glow = { version = "0.11", optional = true } +glow = { version = "0.12", optional = true } ron = { version = "0.8", optional = true, features = ["integer128"] } serde = { version = "1", optional = true, features = ["derive"] } diff --git a/crates/egui_glow/CHANGELOG.md b/crates/egui_glow/CHANGELOG.md index 7b7d7182..3710fb55 100644 --- a/crates/egui_glow/CHANGELOG.md +++ b/crates/egui_glow/CHANGELOG.md @@ -4,6 +4,7 @@ All notable changes to the `egui_glow` integration will be noted in this file. ## Unreleased * Remove the `screen_reader` feature ([#2669](https://github.com/emilk/egui/pull/2669)). +* Update to `glow` 0.12 ([#2695](https://github.com/emilk/egui/pull/2695)). ## 0.20.1 - 2022-12-11 diff --git a/crates/egui_glow/Cargo.toml b/crates/egui_glow/Cargo.toml index e7f065b2..b397a5a8 100644 --- a/crates/egui_glow/Cargo.toml +++ b/crates/egui_glow/Cargo.toml @@ -49,7 +49,7 @@ egui = { version = "0.20.0", path = "../egui", default-features = false, feature ] } bytemuck = "1.7" -glow = "0.11" +glow = "0.12" memoffset = "0.6" tracing = { version = "0.1", default-features = false, features = ["std"] } @@ -69,7 +69,7 @@ wasm-bindgen = { version = "0.2" } [dev-dependencies] -glutin = "0.30" # examples/pure_glow +glutin = "0.30" # examples/pure_glow raw-window-handle = "0.5.0" glutin-winit = "0.3.0" diff --git a/deny.toml b/deny.toml index b9147a27..8ddfc3e5 100644 --- a/deny.toml +++ b/deny.toml @@ -46,7 +46,6 @@ skip-tree = [ { name = "darling" }, # old version via tts { name = "foreign-types" }, # old version from wgpu { name = "rfd" }, # example dependency - { name = "three-d" }, # example dependency ] diff --git a/examples/custom_3d_glow/Cargo.toml b/examples/custom_3d_glow/Cargo.toml index b44cb491..c71c45e4 100644 --- a/examples/custom_3d_glow/Cargo.toml +++ b/examples/custom_3d_glow/Cargo.toml @@ -13,4 +13,4 @@ eframe = { path = "../../crates/eframe", features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } egui_glow = { path = "../../crates/egui_glow" } -glow = "0.11" +glow = "0.12" diff --git a/examples/custom_3d_three-d/Cargo.toml b/examples/custom_3d_three-d/Cargo.toml deleted file mode 100644 index 28ece334..00000000 --- a/examples/custom_3d_three-d/Cargo.toml +++ /dev/null @@ -1,24 +0,0 @@ -[package] -name = "custom_3d_three-d" -version = "0.1.0" -authors = ["Emil Ernerfeldt "] -license = "MIT OR Apache-2.0" -edition = "2021" -rust-version = "1.65" -publish = false - -[lib] -crate-type = ["cdylib", "rlib"] - -[dependencies] -eframe = { path = "../../crates/eframe", features = [ - "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO -] } -egui_glow = { path = "../../crates/egui_glow" } -glow = "0.11" -three-d = { version = "0.13", default-features = false } - -[target.'cfg(target_arch = "wasm32")'.dependencies] # Web dependencies -console_error_panic_hook = "0.1" # For logging -wasm-bindgen = "0.2" # Core bindings -wasm-bindgen-futures = "0.4" # Core bindings diff --git a/examples/custom_3d_three-d/README.md b/examples/custom_3d_three-d/README.md deleted file mode 100644 index c708a692..00000000 --- a/examples/custom_3d_three-d/README.md +++ /dev/null @@ -1,22 +0,0 @@ -This demo shows how to embed 3D rendering using [`three-d`](https://github.com/asny/three-d) in `eframe`. - -Any 3D library built on top of [`glow`](https://github.com/grovesNL/glow) can be used in `eframe`. - -Alternatively you can render 3D stuff to a texture and display it using [`egui::Ui::image`]. - -If you are content of having egui sit on top of a 3D background, take a look at: - -* [`bevy_egui`](https://github.com/mvlabat/bevy_egui) -* [`three-d`](https://github.com/asny/three-d) - - - -```sh -cargo run -p custom_3d_three-d -``` - -``` -wasm-pack build examples/custom_3d_three-d --target web -``` - -![](screenshot.png) diff --git a/examples/custom_3d_three-d/index.html b/examples/custom_3d_three-d/index.html deleted file mode 100644 index e26cad7c..00000000 --- a/examples/custom_3d_three-d/index.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - diff --git a/examples/custom_3d_three-d/screenshot.png b/examples/custom_3d_three-d/screenshot.png deleted file mode 100644 index bdff41024874a61738775d05d512ef64c0feca9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52939 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�Pp}5+YNQb+TjqFl{ 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 Y)XoP{U$7dWZvbCfPxaNRRGx?aAL^i!g8%>k diff --git a/examples/custom_3d_three-d/src/lib.rs b/examples/custom_3d_three-d/src/lib.rs deleted file mode 100644 index 9d081b17..00000000 --- a/examples/custom_3d_three-d/src/lib.rs +++ /dev/null @@ -1,21 +0,0 @@ -#![allow(special_module_name)] - -mod main; - -// Entry point for wasm -#[cfg(target_arch = "wasm32")] -use wasm_bindgen::prelude::*; - -#[cfg(target_arch = "wasm32")] -#[wasm_bindgen(start)] -pub async fn start() -> Result<(), JsValue> { - std::panic::set_hook(Box::new(console_error_panic_hook::hook)); - - let web_options = eframe::WebOptions::default(); - eframe::start_web( - "my", - web_options, - Box::new(|cc| Box::new(main::MyApp::new(cc))), - )?; - Ok(()) -} diff --git a/examples/custom_3d_three-d/src/main.rs b/examples/custom_3d_three-d/src/main.rs deleted file mode 100644 index b43ca35f..00000000 --- a/examples/custom_3d_three-d/src/main.rs +++ /dev/null @@ -1,231 +0,0 @@ -#![allow(dead_code)] -#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release - -use eframe::egui; - -#[cfg(not(target_arch = "wasm32"))] -fn main() -> Result<(), eframe::Error> { - let options = eframe::NativeOptions { - initial_window_size: Some(egui::vec2(550.0, 610.0)), - multisampling: 4, - renderer: eframe::Renderer::Glow, - depth_buffer: 24, - ..Default::default() - }; - eframe::run_native( - "Custom 3D painting in eframe!", - options, - Box::new(|cc| Box::new(MyApp::new(cc))), - ) -} - -pub struct MyApp { - angle: f32, -} - -impl MyApp { - pub fn new(_cc: &eframe::CreationContext<'_>) -> Self { - Self { angle: 0.2 } - } -} - -impl eframe::App for MyApp { - fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { - egui::CentralPanel::default().show(ctx, |ui| { - egui::widgets::global_dark_light_mode_buttons(ui); - - ui.horizontal(|ui| { - ui.spacing_mut().item_spacing.x = 0.0; - ui.label("The triangle is being painted using "); - ui.hyperlink_to("three-d", "https://github.com/asny/three-d"); - ui.label("."); - }); - - egui::ScrollArea::both().show(ui, |ui| { - egui::Frame::canvas(ui.style()).show(ui, |ui| { - let (rect, response) = - ui.allocate_exact_size(egui::Vec2::splat(512.0), egui::Sense::drag()); - - self.angle += response.drag_delta().x * 0.01; - - // Clone locals so we can move them into the paint callback: - let angle = self.angle; - - let callback = egui::PaintCallback { - rect, - callback: std::sync::Arc::new(egui_glow::CallbackFn::new( - move |info, painter| { - with_three_d(painter.gl(), |three_d| { - three_d.frame( - FrameInput::new(&three_d.context, &info, painter), - angle, - ); - }); - }, - )), - }; - ui.painter().add(callback); - }); - ui.label("Drag to rotate!"); - }); - }); - } -} - -/// We get a [`glow::Context`] from `eframe` and we want to construct a [`ThreeDApp`]. -/// -/// Sadly we can't just create a [`ThreeDApp`] in [`MyApp::new`] and pass it -/// to the [`egui::PaintCallback`] because [`glow::Context`] isn't `Send+Sync` on web, which -/// [`egui::PaintCallback`] needs. If you do not target web, then you can construct the [`ThreeDApp`] in [`MyApp::new`]. -fn with_three_d(gl: &std::sync::Arc, f: impl FnOnce(&mut ThreeDApp) -> R) -> R { - use std::cell::RefCell; - thread_local! { - pub static THREE_D: RefCell> = RefCell::new(None); - } - - THREE_D.with(|three_d| { - let mut three_d = three_d.borrow_mut(); - let three_d = three_d.get_or_insert_with(|| ThreeDApp::new(gl.clone())); - f(three_d) - }) -} - -/// -/// Translates from egui input to three-d input -/// -pub struct FrameInput<'a> { - screen: three_d::RenderTarget<'a>, - viewport: three_d::Viewport, - scissor_box: three_d::ScissorBox, -} - -impl FrameInput<'_> { - pub fn new( - context: &three_d::Context, - info: &egui::PaintCallbackInfo, - painter: &egui_glow::Painter, - ) -> Self { - use three_d::*; - - // Disable sRGB textures for three-d - #[cfg(not(target_arch = "wasm32"))] - #[allow(unsafe_code)] - unsafe { - use glow::HasContext as _; - context.disable(glow::FRAMEBUFFER_SRGB); - } - - // Constructs a screen render target to render the final image to - let screen = painter.intermediate_fbo().map_or_else( - || { - RenderTarget::screen( - context, - info.viewport.width() as u32, - info.viewport.height() as u32, - ) - }, - |fbo| { - RenderTarget::from_framebuffer( - context, - info.viewport.width() as u32, - info.viewport.height() as u32, - fbo, - ) - }, - ); - - // Set where to paint - let viewport = info.viewport_in_pixels(); - let viewport = Viewport { - x: viewport.left_px.round() as _, - y: viewport.from_bottom_px.round() as _, - width: viewport.width_px.round() as _, - height: viewport.height_px.round() as _, - }; - - // Respect the egui clip region (e.g. if we are inside an `egui::ScrollArea`). - let clip_rect = info.clip_rect_in_pixels(); - let scissor_box = ScissorBox { - x: clip_rect.left_px.round() as _, - y: clip_rect.from_bottom_px.round() as _, - width: clip_rect.width_px.round() as _, - height: clip_rect.height_px.round() as _, - }; - Self { - screen, - scissor_box, - viewport, - } - } -} - -/// -/// Based on the `three-d` [Triangle example](https://github.com/asny/three-d/blob/master/examples/triangle/src/main.rs). -/// This is where you'll need to customize -/// -use three_d::*; -pub struct ThreeDApp { - context: Context, - camera: Camera, - model: Gm, -} - -impl ThreeDApp { - pub fn new(gl: std::sync::Arc) -> Self { - let context = Context::from_gl_context(gl).unwrap(); - // Create a camera - let camera = Camera::new_perspective( - Viewport::new_at_origo(1, 1), - vec3(0.0, 0.0, 2.0), - vec3(0.0, 0.0, 0.0), - vec3(0.0, 1.0, 0.0), - degrees(45.0), - 0.1, - 10.0, - ); - - // Create a CPU-side mesh consisting of a single colored triangle - let positions = vec![ - vec3(0.5, -0.5, 0.0), // bottom right - vec3(-0.5, -0.5, 0.0), // bottom left - vec3(0.0, 0.5, 0.0), // top - ]; - let colors = vec![ - Color::new(255, 0, 0, 255), // bottom right - Color::new(0, 255, 0, 255), // bottom left - Color::new(0, 0, 255, 255), // top - ]; - let cpu_mesh = CpuMesh { - positions: Positions::F32(positions), - colors: Some(colors), - ..Default::default() - }; - - // Construct a model, with a default color material, thereby transferring the mesh data to the GPU - let model = Gm::new(Mesh::new(&context, &cpu_mesh), ColorMaterial::default()); - Self { - context, - camera, - model, - } - } - - pub fn frame(&mut self, frame_input: FrameInput<'_>, angle: f32) -> Option { - // Ensure the viewport matches the current window viewport which changes if the window is resized - self.camera.set_viewport(frame_input.viewport); - - // Set the current transformation of the triangle - self.model - .set_transformation(Mat4::from_angle_y(radians(angle))); - - // Get the screen render target to be able to render something on the screen - frame_input - .screen - // Clear the color and depth of the screen render target - .clear_partially(frame_input.scissor_box, ClearState::depth(1.0)) - // Render the triangle with the color material which uses the per vertex colors defined at construction - .render_partially(frame_input.scissor_box, &self.camera, &[&self.model], &[]); - - frame_input.screen.into_framebuffer() // Take back the screen fbo, we will continue to use it. - } -}