wip: added collider point collection

feat/shadows
hheik 2023-09-02 14:49:44 +03:00
parent 3fbe81d388
commit 69c176ed88
1 changed files with 50 additions and 8 deletions

View File

@ -176,6 +176,8 @@ fn prepare_lights(
mut images: ResMut<Assets<Image>>,
rapier_context: Res<RapierContext>,
visibility_blocker_query: Query<&VisibilityBlocker>,
transform_query: Query<&GlobalTransform>,
collider_query: Query<&Collider>,
material_query: Query<&Handle<DarknessMaterial>>,
point_light_query: Query<(&GlobalTransform, &PointLight2D)>,
spot_light_query: Query<(&GlobalTransform, &SpotLight2D)>,
@ -201,7 +203,18 @@ fn prepare_lights(
.iter()
.enumerate()
.for_each(|(i, (transform, light))| {
get_light_geometry(&rapier_context, &visibility_blocker_query, *light);
let rect = light.aabb();
let points = get_light_geometry(
&rapier_context,
&visibility_blocker_query,
&transform_query,
&collider_query,
Rect::from_corners(
rect.min + transform.translation().truncate(),
rect.max + transform.translation().truncate(),
),
);
println!("{points:?}");
material.point_lights[i] = GpuPointLight2D {
position: transform.translation().truncate(),
radius: light.radius,
@ -247,17 +260,46 @@ fn prepare_lights(
fn get_light_geometry(
rapier_context: &Res<RapierContext>,
visibility_blocker_query: &Query<&VisibilityBlocker>,
light: &impl LightAabb,
transform_query: &Query<&GlobalTransform>,
collider_query: &Query<&Collider>,
aabb: Rect,
) -> Vec<Vec2> {
let rect = light.aabb();
let collider = Collider::cuboid(rect.half_size().x, rect.half_size().y);
let mut points = vec![
Vec2::new(aabb.min.x, aabb.min.y),
Vec2::new(aabb.max.x, aabb.min.y),
Vec2::new(aabb.max.x, aabb.max.y),
Vec2::new(aabb.min.x, aabb.max.y),
];
let collider = Collider::cuboid(aabb.half_size().x, aabb.half_size().y);
let mut filter = QueryFilter::new().exclude_sensors();
let predicate = |coll_entity| visibility_blocker_query.get(coll_entity).is_ok();
filter.predicate = Some(&predicate);
let mut colls = vec![];
rapier_context.intersections_with_shape(rect.center(), 0.0, &collider, filter, |coll| {
colls.push(coll);
rapier_context.intersections_with_shape(aabb.center(), 0.0, &collider, filter, |coll| {
let transform = transform_query
.get(coll)
.expect("Collider should have GlobalTransform");
if let Ok(collider) = collider_query.get(coll) {
if let Some(cuboid) = collider.as_cuboid() {
let rect = Rect::from_center_half_size(
transform.translation().truncate(),
cuboid.half_extents(),
);
points.push(rect.min);
points.push(rect.max);
points.push(Vec2::new(rect.min.x, rect.max.y));
points.push(Vec2::new(rect.max.x, rect.min.y));
}
}
true
});
vec![]
points.sort_unstable_by(|a, b| {
f32::atan2(a.y, a.x)
.partial_cmp(&f32::atan2(b.y, b.x))
.unwrap()
});
points
}