use bevy::prelude::*;
use bevy_mod_spatial_query::draw_spatial_lookup_gizmos;
use bevy_mod_spatial_query::prelude::*;
const ROWS: usize = 720 / 4;
const COLUMNS: usize = 1280 / 4;
const CIRCLE_RADIUS: f32 = 2.0;
const LOOKUP_RADIUS: f32 = 10.0;
fn main() {
let mut app = App::new();
app.add_plugins(DefaultPlugins)
.add_plugins(SpatialQueriesPlugin)
.add_systems(Startup, setup)
.add_systems(Update, change_color_on_hover)
.add_systems(PostUpdate, draw_spatial_lookup_gizmos);
app.run();
}
#[derive(Resource)]
struct ExampleMaterials {
default_material: Handle<ColorMaterial>,
hovered_material: Handle<ColorMaterial>,
}
#[derive(Component)]
struct CircleMarker;
fn setup(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<ColorMaterial>>,
) {
let default_material = materials.add(Color::linear_rgb(0.1, 0.1, 0.1));
let hovered_material = materials.add(Color::linear_rgb(0.8, 0.8, 0.8));
let mesh = meshes.add(Circle::new(CIRCLE_RADIUS));
let center_offset = Vec3::new(
CIRCLE_RADIUS * 2. * COLUMNS as f32 / 2.,
CIRCLE_RADIUS * 2. * ROWS as f32 / 2.,
0.,
);
for row in 0..ROWS {
for col in 0..COLUMNS {
commands.spawn((
Mesh2d(mesh.clone()),
MeshMaterial2d(default_material.clone()),
Transform::from_translation(
Vec3::new(
col as f32 * CIRCLE_RADIUS * 2.,
row as f32 * CIRCLE_RADIUS * 2.,
0.0,
) - center_offset,
),
CircleMarker,
));
}
}
commands.spawn(Camera2d);
commands.insert_resource(ExampleMaterials {
default_material,
hovered_material,
});
}
fn change_color_on_hover(
camera_query: Single<(&Camera, &GlobalTransform)>,
window: Query<&Window>,
mut circles: SpatialQuery<&mut MeshMaterial2d<ColorMaterial>, With<CircleMarker>>,
materials: Res<ExampleMaterials>,
) {
let (camera, camera_transform) = *camera_query;
let Ok(window) = window.get_single() else {
return;
};
let Some(cursor_position) = window.cursor_position() else {
return;
};
let Ok(world_position) = camera.viewport_to_world_2d(camera_transform, cursor_position) else {
return;
};
for mut circle_material in circles.in_radius(world_position.extend(0.), LOOKUP_RADIUS) {
circle_material.0 = materials.hovered_material.clone();
}
}