use crate::input::{mouse_clicked, mouse_position};
use crate::scene::is_reserved;
use nightshade::ecs::gpu_picking::{GpuPickResult, surface_pick_coords};
use nightshade::prelude::*;
use nightshade::render::config::ViewportRect;
use std::collections::HashSet;
pub fn entity_under_cursor(world: &World) -> Option<Entity> {
pick_entities(world, mouse_position(world), PickingOptions::default())
.into_iter()
.map(|result| result.entity)
.find(|&entity| !is_reserved(world, entity))
}
pub fn clicked_entity(world: &World) -> Option<Entity> {
if !mouse_clicked(world, MouseButton::Left) {
return None;
}
entity_under_cursor(world)
}
pub fn cursor_on_ground(world: &World) -> Option<Vec3> {
get_ground_position_from_screen(world, mouse_position(world), 0.0)
}
pub fn pick_excluding(
world: &World,
screen_pos: Vec2,
exclude: &HashSet<Entity>,
) -> Option<Entity> {
pick_entities(world, screen_pos, PickingOptions::default())
.into_iter()
.map(|result| result.entity)
.find(|entity| !is_reserved(world, *entity) && !exclude.contains(entity))
}
pub fn request_surface_pick(world: &mut World, screen_pos: Vec2) {
let rect = world.resources.window.active_viewport_rect.or_else(|| {
world
.resources
.window
.cached_viewport_size
.map(|(width, height)| ViewportRect {
x: 0.0,
y: 0.0,
width: width as f32,
height: height as f32,
})
});
let render_scale = world
.resources
.render_settings
.render_scale
.clamp(0.25, 4.0);
let surface_size = rect
.map(|rect| {
(
((rect.width * render_scale).round() as u32).max(1),
((rect.height * render_scale).round() as u32).max(1),
)
})
.unwrap_or((1, 1));
if let Some((pick_x, pick_y)) = surface_pick_coords(screen_pos, rect, surface_size) {
world.resources.gpu_picking.request_pick(pick_x, pick_y);
}
}
pub fn take_surface_pick(world: &mut World) -> Option<GpuPickResult> {
world.resources.gpu_picking.take_result()
}