Skip to content

Commit 95b73ad

Browse files
committed
update to version 3.0 with bevy 0.17
1 parent dee49c1 commit 95b73ad

File tree

7 files changed

+79
-68
lines changed

7 files changed

+79
-68
lines changed

Cargo.toml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "bevy_voxel_plot"
3-
version = "2.3.0"
3+
version = "3.0.0"
44
edition = "2021"
55
authors = ["Linus Leo Stöckli"]
66
repository = "https://github.com/hacknus/bevy_voxel_plot"
@@ -13,9 +13,9 @@ homepage = "https://github.com/hacknus/bevy_voxel_plot"
1313
license = "Apache-2.0"
1414

1515
[dependencies]
16-
bevy = "0.16"
17-
bytemuck = "1.22.0"
16+
bevy = "0.17"
17+
bytemuck = "1.24.0"
1818

1919
[dev-dependencies]
20-
bevy_panorbit_camera = { version = "0.26" }
21-
bevy_egui = { version = "0.34" }
20+
bevy_panorbit_camera = { version = "0.33" }
21+
bevy_egui = { version = "0.38" }

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ low alpha.
4040

4141
| bevy | bevy_voxel_plot |
4242
|------|-----------------|
43+
| 0.17 | 3.0 |
4344
| 0.16 | 2.0 |
4445
| 0.15 | 1.0 |
4546

examples/bevy_egui.rs

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,17 @@
11
use bevy::app::{App, Startup};
22
use bevy::asset::Assets;
3+
use bevy::camera::{ImageRenderTarget, RenderTarget};
4+
use bevy::camera::visibility::{NoFrustumCulling, RenderLayers};
35
use bevy::color::{Color, LinearRgba};
46
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};
128
use bevy::render::render_resource::{
139
Extent3d, TextureDescriptor, TextureDimension, TextureFormat, TextureUsages,
1410
};
15-
use bevy::render::view::{NoFrustumCulling, RenderLayers};
1611
use bevy::window::PrimaryWindow;
1712
use bevy::DefaultPlugins;
1813
use bevy_egui::egui::{epaint, Ui};
19-
use bevy_egui::{egui, EguiContexts, EguiPlugin, EguiUserTextures};
14+
use bevy_egui::{egui, EguiContexts, EguiPlugin, EguiPrimaryContextPass, EguiStartupSet, EguiUserTextures};
2015
use bevy_panorbit_camera::{ActiveCameraData, PanOrbitCamera, PanOrbitCameraPlugin};
2116
use bevy_voxel_plot::{InstanceData, InstanceMaterialData, VoxelMaterialPlugin};
2217

@@ -62,7 +57,8 @@ fn generate_dummy_data() -> (Vec<InstanceData>, f32, f32, f32) {
6257
let (r, g, b) = jet_colormap(opacity);
6358

6459
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,
6662
color: LinearRgba::from(Color::srgba(r, g, b, opacity.powf(2.0)))
6763
.to_f32_array(),
6864
};
@@ -150,7 +146,7 @@ fn voxel_plot_setup(
150146
image.resize(size);
151147

152148
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()));
154150
commands.insert_resource(RenderImage(image_handle.clone()));
155151

156152
// 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(
209205
mut opacity_threshold: ResMut<OpacityThreshold>,
210206
mut cam_input: ResMut<CameraInputAllowed>,
211207
) {
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();
215209

216210
let width = 300.0;
217211
let height = 500.0;
218212

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+
231228
}
232229
fn show_plot(
233230
meshes: &mut ResMut<Assets<Mesh>>,
@@ -288,20 +285,27 @@ fn show_plot(
288285
}
289286
});
290287
}
288+
289+
fn setup_camera(mut commands: Commands) {
290+
// camera required by bevy-egui
291+
commands.spawn(Camera2d);
292+
}
291293
fn main() {
292294
App::new()
293295
.add_plugins((
294296
DefaultPlugins,
295-
EguiPlugin {
296-
enable_multipass_for_primary_context: false,
297-
},
297+
EguiPlugin::default(),
298298
VoxelMaterialPlugin,
299299
PanOrbitCameraPlugin,
300300
))
301301
.insert_resource(OpacityThreshold(0.0)) // Start with no threshold
302302
.insert_resource(CameraInputAllowed(false))
303303
.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)
305309
.add_systems(Update, set_enable_camera_controls_system)
306310
.run();
307311
}

examples/bevy_pan_orbit_camera.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
use bevy::app::{App, Startup};
22
use bevy::asset::Assets;
3+
use bevy::camera::visibility::NoFrustumCulling;
34
use bevy::color::{Color, LinearRgba};
45
use bevy::math::Vec3;
5-
use bevy::pbr::AmbientLight;
6-
use bevy::prelude::{ColorToComponents, Commands, Cuboid, Mesh, Mesh3d, ResMut, Transform};
7-
use bevy::render::view::NoFrustumCulling;
6+
use bevy::prelude::{AmbientLight, ColorToComponents, Commands, Cuboid, Mesh, Mesh3d, ResMut, Transform};
87
use bevy::DefaultPlugins;
98
use bevy_panorbit_camera::{PanOrbitCamera, PanOrbitCameraPlugin};
109
use bevy_voxel_plot::{InstanceData, InstanceMaterialData, VoxelMaterialPlugin};
@@ -42,7 +41,8 @@ fn generate_dummy_data() -> (Vec<InstanceData>, f32, f32, f32) {
4241
let (r, g, b) = jet_colormap(opacity);
4342

4443
let instance = InstanceData {
45-
pos_scale: [position.x, position.y, position.z, 1.0],
44+
position: [position.x, position.y, position.z],
45+
scale: 1.0,
4646
color: LinearRgba::from(Color::srgba(r, g, b, opacity.powf(2.0)))
4747
.to_f32_array(),
4848
};

examples/bevy_pointcloud_bunny.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
use bevy::app::{App, Startup};
22
use bevy::asset::Assets;
3+
use bevy::camera::visibility::NoFrustumCulling;
34
use bevy::color::{Color, LinearRgba};
45
use bevy::math::Vec3;
5-
use bevy::pbr::AmbientLight;
6-
use bevy::prelude::{ColorToComponents, Commands, Cuboid, Mesh, Mesh3d, ResMut, Transform};
7-
use bevy::render::view::NoFrustumCulling;
6+
use bevy::prelude::{
7+
AmbientLight, ColorToComponents, Commands, Cuboid, Mesh, Mesh3d, ResMut, Transform,
8+
};
89
use bevy::DefaultPlugins;
910
use bevy_panorbit_camera::{PanOrbitCamera, PanOrbitCameraPlugin};
1011
use bevy_voxel_plot::{InstanceData, InstanceMaterialData, VoxelMaterialPlugin};
@@ -52,7 +53,8 @@ fn load_pcd_file(path: &Path) -> (Vec<InstanceData>, f32, f32, f32) {
5253
let (r, g, b) = jet_colormap(z * 10.0);
5354

5455
let instance = InstanceData {
55-
pos_scale: [x, y, z, 1.0], // position + uniform scale
56+
position: [x, y, z], // position + uniform scale
57+
scale: 1.0,
5658
color: LinearRgba::from(Color::srgba(r, g, b, 0.01)).to_f32_array(), // you can set color later if needed
5759
};
5860

examples/simple_cubes.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
11
use bevy::prelude::*;
2-
use bevy::pbr::AmbientLight;
32
use bevy_voxel_plot::{InstanceData, InstanceMaterialData, VoxelMaterialPlugin};
43
use bevy_panorbit_camera::{PanOrbitCamera, PanOrbitCameraPlugin};
54

65
fn setup(mut commands: Commands, mut meshes: ResMut<Assets<Mesh>>) {
76
// Two cubes: one red (alpha 1.0), one blue (alpha 0.5)
87
let instances = vec![
98
InstanceData {
10-
pos_scale: [0.0, 0.0, 0.0, 1.0],
9+
position: [0.0, 0.0, 0.0],
10+
scale: 1.0,
1111
color: LinearRgba::from(Color::srgba(1.0, 0.0, 0.0, 0.5))
1212
.to_f32_array()
1313
},
1414
InstanceData {
15-
pos_scale: [0.3, 0.0, 0.0, 1.0],
15+
position: [0.3, 0.0, 0.0],
16+
scale: 1.0,
1617
color: LinearRgba::from(Color::srgba(0.0, 1.0, 0.0, 0.5))
1718
.to_f32_array()
1819
},
1920
InstanceData {
20-
pos_scale: [0.6, 0.0, 0.0, 1.0],
21+
position: [0.6, 0.0, 0.0],
22+
scale:1.0,
2123
color: LinearRgba::from(Color::srgba(0.0, 0.0, 1.0, 0.5))
2224
.to_f32_array()
2325
},
@@ -38,7 +40,6 @@ fn setup(mut commands: Commands, mut meshes: ResMut<Assets<Mesh>>) {
3840

3941
// Camera
4042
commands.spawn((
41-
Camera3d::default(),
4243
Transform::from_xyz(1.5, 1.0, 1.5).looking_at(Vec3::ZERO, Vec3::Y),
4344
PanOrbitCamera::default(),
4445
));
@@ -49,4 +50,4 @@ fn main() {
4950
.add_plugins((DefaultPlugins, VoxelMaterialPlugin, PanOrbitCameraPlugin))
5051
.add_systems(Startup, setup)
5152
.run();
52-
}
53+
}

src/bevy_voxel_plot.rs

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
//! implementation using Bevy's low level rendering API.
88
//! It's generally recommended to try the built-in instancing before going with this approach.
99
10-
use bevy::asset::{load_internal_asset, weak_handle};
10+
use bevy::asset::{load_internal_asset, uuid_handle};
11+
use bevy::mesh::{MeshVertexBufferLayoutRef, VertexBufferLayout};
12+
use bevy::render::RenderSystems;
1113
use bevy::{
1214
core_pipeline::core_3d::Transparent3d,
1315
ecs::{
@@ -20,9 +22,7 @@ use bevy::{
2022
prelude::*,
2123
render::{
2224
extract_component::{ExtractComponent, ExtractComponentPlugin},
23-
mesh::{
24-
allocator::MeshAllocator, MeshVertexBufferLayoutRef, RenderMesh, RenderMeshBufferInfo,
25-
},
25+
mesh::{allocator::MeshAllocator, RenderMesh, RenderMeshBufferInfo},
2626
render_asset::RenderAssets,
2727
render_phase::{
2828
AddRenderCommand, DrawFunctions, PhaseItem, PhaseItemExtraIndex, RenderCommand,
@@ -32,9 +32,10 @@ use bevy::{
3232
renderer::RenderDevice,
3333
sync_world::MainEntity,
3434
view::ExtractedView,
35-
Render, RenderApp, RenderSet,
35+
Render, RenderApp,
3636
},
3737
};
38+
use bevy::pbr::SetMeshViewBindingArrayBindGroup;
3839
use bytemuck::{Pod, Zeroable};
3940

4041
/// Component holding per-instance data for custom rendering.
@@ -49,7 +50,7 @@ impl ExtractComponent for InstanceMaterialData {
4950
type QueryFilter = ();
5051
type Out = Self;
5152

52-
fn extract_component(item: QueryItem<'_, Self::QueryData>) -> Option<Self> {
53+
fn extract_component(item: QueryItem<'_, '_, Self::QueryData>) -> Option<Self> {
5354
Some(InstanceMaterialData {
5455
instances: item.instances.clone(),
5556
})
@@ -59,7 +60,7 @@ impl ExtractComponent for InstanceMaterialData {
5960
/// Plugin that sets up the custom voxel material pipeline.
6061
pub struct VoxelMaterialPlugin;
6162

62-
pub const SHADER_HANDLE: Handle<Shader> = weak_handle!("123e4567-e89b-12d3-a456-426614174000");
63+
pub const SHADER_HANDLE: Handle<Shader> = uuid_handle!("123e4567-e89b-12d3-a456-426614174000");
6364
impl Plugin for VoxelMaterialPlugin {
6465
fn build(&self, app: &mut App) {
6566
app.add_plugins(ExtractComponentPlugin::<InstanceMaterialData>::default());
@@ -71,8 +72,8 @@ impl Plugin for VoxelMaterialPlugin {
7172
.add_systems(
7273
Render,
7374
(
74-
queue_custom.in_set(RenderSet::QueueMeshes),
75-
prepare_instance_buffers.in_set(RenderSet::PrepareResources),
75+
queue_custom.in_set(RenderSystems::QueueMeshes),
76+
prepare_instance_buffers.in_set(RenderSystems::PrepareResources),
7677
),
7778
);
7879
load_internal_asset!(
@@ -88,13 +89,14 @@ impl Plugin for VoxelMaterialPlugin {
8889
}
8990
}
9091

91-
9292
/// Single instance data containing position, scale and color.
9393
#[derive(Clone, Copy, Pod, Zeroable)]
9494
#[repr(C)]
9595
pub struct InstanceData {
96-
/// (x, y, z) position and uniform scale.
97-
pub pos_scale: [f32; 4],
96+
/// (x, y, z) position
97+
pub position: [f32; 3],
98+
/// Uniform scale
99+
pub scale: f32,
98100
/// RGBA color.
99101
pub color: [f32; 4],
100102
}
@@ -166,12 +168,11 @@ impl ExtractComponent for CameraPosition {
166168
type QueryFilter = With<Camera3d>;
167169
type Out = Self;
168170

169-
fn extract_component(transform: QueryItem<'_, Self::QueryData>) -> Option<Self> {
171+
fn extract_component(transform: QueryItem<'_, '_, Self::QueryData>) -> Option<Self> {
170172
Some(CameraPosition(transform.translation()))
171173
}
172174
}
173175

174-
175176
/// Prepares instance buffers each frame, sorting instances by distance to camera.
176177
fn prepare_instance_buffers(
177178
mut commands: Commands,
@@ -196,9 +197,11 @@ fn prepare_instance_buffers(
196197

197198
let mut sorted_instances = instance_data.instances.clone();
198199
sorted_instances.sort_by(|a, b| {
199-
let dist_a = camera_pos.distance_squared(Vec3::from_slice(&a.pos_scale[0..3]));
200-
let dist_b = camera_pos.distance_squared(Vec3::from_slice(&b.pos_scale[0..3]));
201-
dist_b.partial_cmp(&dist_a).unwrap_or(std::cmp::Ordering::Equal)
200+
let dist_a = camera_pos.distance_squared(Vec3::from_slice(&a.position));
201+
let dist_b = camera_pos.distance_squared(Vec3::from_slice(&b.position));
202+
dist_b
203+
.partial_cmp(&dist_a)
204+
.unwrap_or(std::cmp::Ordering::Equal)
202205
});
203206

204207
// Debug: Print instance order and distances
@@ -222,7 +225,6 @@ fn prepare_instance_buffers(
222225
}
223226
}
224227

225-
226228
/// Custom pipeline for instanced mesh rendering.
227229
#[derive(Resource)]
228230
struct CustomPipeline {
@@ -307,7 +309,8 @@ impl SpecializedMeshPipeline for CustomPipeline {
307309
type DrawCustom = (
308310
SetItemPipeline,
309311
SetMeshViewBindGroup<0>,
310-
SetMeshBindGroup<1>,
312+
SetMeshViewBindingArrayBindGroup<1>,
313+
SetMeshBindGroup<2>,
311314
DrawMeshInstanced,
312315
);
313316

0 commit comments

Comments
 (0)