|
1 | 1 | use bevy::app::{App, Startup}; |
2 | 2 | use bevy::asset::Assets; |
| 3 | +use bevy::camera::{ImageRenderTarget, RenderTarget}; |
| 4 | +use bevy::camera::visibility::{NoFrustumCulling, RenderLayers}; |
3 | 5 | use bevy::color::{Color, LinearRgba}; |
4 | 6 | use bevy::math::{Vec2, Vec3}; |
5 | | -use bevy::pbr::AmbientLight; |
6 | | -use bevy::prelude::{ |
7 | | - default, Camera, ClearColorConfig, ColorToComponents, Commands, Cuboid, Deref, |
8 | | - DetectChangesMut, Handle, Image, Mesh, Mesh3d, Query, Res, ResMut, Resource, Transform, Update, |
9 | | - Window, With, |
10 | | -}; |
11 | | -use bevy::render::camera::{ImageRenderTarget, RenderTarget}; |
| 7 | +use bevy::prelude::{default, AmbientLight, Camera, Camera2d, ClearColorConfig, ColorToComponents, Commands, Cuboid, Deref, DetectChangesMut, Handle, Image, IntoScheduleConfigs, Mesh, Mesh3d, PreStartup, Query, Res, ResMut, Resource, Transform, Update, Window, With}; |
12 | 8 | use bevy::render::render_resource::{ |
13 | 9 | Extent3d, TextureDescriptor, TextureDimension, TextureFormat, TextureUsages, |
14 | 10 | }; |
15 | | -use bevy::render::view::{NoFrustumCulling, RenderLayers}; |
16 | 11 | use bevy::window::PrimaryWindow; |
17 | 12 | use bevy::DefaultPlugins; |
18 | 13 | use bevy_egui::egui::{epaint, Ui}; |
19 | | -use bevy_egui::{egui, EguiContexts, EguiPlugin, EguiUserTextures}; |
| 14 | +use bevy_egui::{egui, EguiContexts, EguiPlugin, EguiPrimaryContextPass, EguiStartupSet, EguiUserTextures}; |
20 | 15 | use bevy_panorbit_camera::{ActiveCameraData, PanOrbitCamera, PanOrbitCameraPlugin}; |
21 | 16 | use bevy_voxel_plot::{InstanceData, InstanceMaterialData, VoxelMaterialPlugin}; |
22 | 17 |
|
@@ -62,7 +57,8 @@ fn generate_dummy_data() -> (Vec<InstanceData>, f32, f32, f32) { |
62 | 57 | let (r, g, b) = jet_colormap(opacity); |
63 | 58 |
|
64 | 59 | let instance = InstanceData { |
65 | | - pos_scale: [position.x, position.y, position.z, 1.0], |
| 60 | + position: [position.x, position.y, position.z], |
| 61 | + scale: 1.0, |
66 | 62 | color: LinearRgba::from(Color::srgba(r, g, b, opacity.powf(2.0))) |
67 | 63 | .to_f32_array(), |
68 | 64 | }; |
@@ -150,7 +146,7 @@ fn voxel_plot_setup( |
150 | 146 | image.resize(size); |
151 | 147 |
|
152 | 148 | let image_handle = images.add(image); |
153 | | - egui_user_textures.add_image(image_handle.clone()); |
| 149 | + egui_user_textures.add_image(bevy_egui::EguiTextureHandle::Strong(image_handle.clone())); |
154 | 150 | commands.insert_resource(RenderImage(image_handle.clone())); |
155 | 151 |
|
156 | 152 | // This specifies the layer used for the first pass, which will be attached to the first pass camera and cube. |
@@ -209,25 +205,26 @@ pub fn update_gui( |
209 | 205 | mut opacity_threshold: ResMut<OpacityThreshold>, |
210 | 206 | mut cam_input: ResMut<CameraInputAllowed>, |
211 | 207 | ) { |
212 | | - let cube_preview_texture_id = contexts.image_id(&cube_preview_image).unwrap(); |
213 | | - |
214 | | - let ctx = contexts.ctx_mut(); |
| 208 | + let cube_preview_texture_id = contexts.image_id(&cube_preview_image.0).unwrap(); |
215 | 209 |
|
216 | 210 | let width = 300.0; |
217 | 211 | let height = 500.0; |
218 | 212 |
|
219 | | - egui::CentralPanel::default().show(ctx, |ui| { |
220 | | - show_plot( |
221 | | - &mut meshes, |
222 | | - &cube_preview_texture_id, |
223 | | - width, |
224 | | - height, |
225 | | - ui, |
226 | | - &mut query, |
227 | | - &mut opacity_threshold, |
228 | | - &mut cam_input, |
229 | | - ) |
230 | | - }); |
| 213 | + if let Ok(ctx) = contexts.ctx_mut() { |
| 214 | + egui::CentralPanel::default().show(ctx, |ui| { |
| 215 | + show_plot( |
| 216 | + &mut meshes, |
| 217 | + &cube_preview_texture_id, |
| 218 | + width, |
| 219 | + height, |
| 220 | + ui, |
| 221 | + &mut query, |
| 222 | + &mut opacity_threshold, |
| 223 | + &mut cam_input, |
| 224 | + ) |
| 225 | + }); |
| 226 | + } |
| 227 | + |
231 | 228 | } |
232 | 229 | fn show_plot( |
233 | 230 | meshes: &mut ResMut<Assets<Mesh>>, |
@@ -288,20 +285,27 @@ fn show_plot( |
288 | 285 | } |
289 | 286 | }); |
290 | 287 | } |
| 288 | + |
| 289 | +fn setup_camera(mut commands: Commands) { |
| 290 | + // camera required by bevy-egui |
| 291 | + commands.spawn(Camera2d); |
| 292 | +} |
291 | 293 | fn main() { |
292 | 294 | App::new() |
293 | 295 | .add_plugins(( |
294 | 296 | DefaultPlugins, |
295 | | - EguiPlugin { |
296 | | - enable_multipass_for_primary_context: false, |
297 | | - }, |
| 297 | + EguiPlugin::default(), |
298 | 298 | VoxelMaterialPlugin, |
299 | 299 | PanOrbitCameraPlugin, |
300 | 300 | )) |
301 | 301 | .insert_resource(OpacityThreshold(0.0)) // Start with no threshold |
302 | 302 | .insert_resource(CameraInputAllowed(false)) |
303 | 303 | .add_systems(Startup, voxel_plot_setup) |
304 | | - .add_systems(Update, update_gui) |
| 304 | + .add_systems( |
| 305 | + PreStartup, |
| 306 | + setup_camera.before(EguiStartupSet::InitContexts), |
| 307 | + ) |
| 308 | + .add_systems(EguiPrimaryContextPass, update_gui) |
305 | 309 | .add_systems(Update, set_enable_camera_controls_system) |
306 | 310 | .run(); |
307 | 311 | } |
0 commit comments