Skip to content

Commit

Permalink
Make many_cubes example more interesting (#4015)
Browse files Browse the repository at this point in the history
# Objective

- Make the many_cubes example more interesting (and look more like many_sprites)

## Solution

- Actually display many cubes
- Move the camera around
  • Loading branch information
mockersf committed Mar 5, 2022
1 parent 0eec2ea commit 6c95b58
Showing 1 changed file with 78 additions and 5 deletions.
83 changes: 78 additions & 5 deletions examples/3d/many_cubes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ fn main() {
.add_plugin(FrameTimeDiagnosticsPlugin::default())
.add_plugin(LogDiagnosticsPlugin::default())
.add_startup_system(setup)
.add_system(move_camera)
.add_system(print_mesh_count)
.run();
}

Expand All @@ -17,8 +19,8 @@ fn setup(
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
) {
const WIDTH: usize = 100;
const HEIGHT: usize = 100;
const WIDTH: usize = 200;
const HEIGHT: usize = 200;
let mesh = meshes.add(Mesh::from(shape::Cube { size: 1.0 }));
let material = materials.add(StandardMaterial {
base_color: Color::PINK,
Expand All @@ -28,17 +30,88 @@ fn setup(
for y in 0..HEIGHT {
// cube
commands.spawn_bundle(PbrBundle {
mesh: mesh.clone(),
material: material.clone(),
mesh: mesh.clone_weak(),
material: material.clone_weak(),
transform: Transform::from_xyz((x as f32) * 2.0, (y as f32) * 2.0, 0.0),
..default()
});
commands.spawn_bundle(PbrBundle {
mesh: mesh.clone_weak(),
material: material.clone_weak(),
transform: Transform::from_xyz(
(x as f32) * 2.0,
HEIGHT as f32 * 2.0,
(y as f32) * 2.0,
),
..Default::default()
});
commands.spawn_bundle(PbrBundle {
mesh: mesh.clone_weak(),
material: material.clone_weak(),
transform: Transform::from_xyz((x as f32) * 2.0, 0.0, (y as f32) * 2.0),
..Default::default()
});
commands.spawn_bundle(PbrBundle {
mesh: mesh.clone_weak(),
material: material.clone_weak(),
transform: Transform::from_xyz(0.0, (x as f32) * 2.0, (y as f32) * 2.0),
..Default::default()
});
}
}

// add one cube, the only one with strong handles
// also serves as a reference point during rotation
commands.spawn_bundle(PbrBundle {
mesh,
material,
transform: Transform {
translation: Vec3::new(0.0, HEIGHT as f32 * 2.0, 0.0),
scale: Vec3::splat(5.0),
..Default::default()
},
..Default::default()
});

// camera
commands.spawn_bundle(PerspectiveCameraBundle {
transform: Transform::from_xyz(80.0, 80.0, 300.0),
transform: Transform::from_xyz(WIDTH as f32, HEIGHT as f32, WIDTH as f32),
..default()
});

commands.spawn_bundle(DirectionalLightBundle {
..Default::default()
});
}

// System for rotating the camera
fn move_camera(time: Res<Time>, mut camera_query: Query<&mut Transform, With<Camera>>) {
let mut camera_transform = camera_query.single_mut();
camera_transform.rotate(Quat::from_rotation_z(time.delta_seconds() * 0.5));
camera_transform.rotate(Quat::from_rotation_x(time.delta_seconds() * 0.5));
}

// System for printing the number of meshes on every tick of the timer
fn print_mesh_count(
time: Res<Time>,
mut timer: Local<PrintingTimer>,
sprites: Query<(&Handle<Mesh>, &ComputedVisibility)>,
) {
timer.0.tick(time.delta());

if timer.0.just_finished() {
info!(
"Meshes: {} - Visible Meshes {}",
sprites.iter().len(),
sprites.iter().filter(|(_, cv)| cv.is_visible).count(),
);
}
}

struct PrintingTimer(Timer);

impl Default for PrintingTimer {
fn default() -> Self {
Self(Timer::from_seconds(1.0, true))
}
}

0 comments on commit 6c95b58

Please sign in to comment.