Skip to content

Commit d129e1c

Browse files
committed
almost working
1 parent db38857 commit d129e1c

2 files changed

Lines changed: 15 additions & 19 deletions

File tree

assets/shaders/instancing.wgsl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
#import bevy_pbr::mesh_functions::{mesh_position_local_to_world}
21
#import bevy_pbr::view_transformations::position_world_to_clip
32

43
struct Vertex {

src/bevy_voxel_plot.rs

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -159,36 +159,32 @@ struct InstanceBuffer {
159159
fn prepare_instance_buffers(
160160
mut commands: Commands,
161161
query: Query<(Entity, &InstanceMaterialData)>,
162-
cameras: Query<&ExtractedView>,
163162
render_device: Res<RenderDevice>,
163+
views: Query<&GlobalTransform, With<Camera>>,
164164
) {
165-
let Some(camera) = cameras.iter().next() else {
166-
return;
167-
};
168-
let cam_pos = camera.world_from_view.transform_point(Vec3::ZERO);
165+
// Get the first camera's position, or use a default if none exist
166+
let camera_pos = views
167+
.iter()
168+
.next()
169+
.map(|transform| transform.translation())
170+
.unwrap_or(Vec3::ZERO);
169171

170172
for (entity, instance_data) in &query {
171-
let mut sorted_instances = instance_data.instances.clone();
172-
173-
if sorted_instances.is_empty() {
173+
if instance_data.instances.is_empty() {
174174
commands.entity(entity).remove::<InstanceBuffer>();
175175
continue;
176176
}
177177

178-
// Sort back-to-front for proper alpha blending
178+
// Sort back-to-front by distance from camera
179+
let mut sorted_instances = instance_data.instances.clone();
179180
sorted_instances.sort_by(|a, b| {
180-
let a_pos = Vec3::new(a.pos_scale[0], a.pos_scale[1], a.pos_scale[2]);
181-
let b_pos = Vec3::new(b.pos_scale[0], b.pos_scale[1], b.pos_scale[2]);
182-
let a_dist = cam_pos.distance_squared(a_pos);
183-
let b_dist = cam_pos.distance_squared(b_pos);
184-
185-
b_dist
186-
.partial_cmp(&a_dist)
187-
.unwrap_or(std::cmp::Ordering::Equal)
181+
let dist_a = camera_pos.distance_squared(Vec3::from_slice(&a.pos_scale[0..3]));
182+
let dist_b = camera_pos.distance_squared(Vec3::from_slice(&b.pos_scale[0..3]));
183+
dist_b.partial_cmp(&dist_a).unwrap_or(std::cmp::Ordering::Equal)
188184
});
189185

190186
let buffer = render_device.create_buffer_with_data(&BufferInitDescriptor {
191-
label: Some("sorted instance data buffer"),
187+
label: Some("instance data buffer"),
192188
contents: bytemuck::cast_slice(sorted_instances.as_slice()),
193189
usage: BufferUsages::VERTEX | BufferUsages::COPY_DST,
194190
});
@@ -200,6 +196,7 @@ fn prepare_instance_buffers(
200196
}
201197
}
202198

199+
203200
/// Custom pipeline for instanced mesh rendering.
204201
#[derive(Resource)]
205202
struct CustomPipeline {

0 commit comments

Comments
 (0)