diff --git a/src/game/darkness.rs b/src/game/darkness.rs index 75e618c..77c0cec 100644 --- a/src/game/darkness.rs +++ b/src/game/darkness.rs @@ -176,6 +176,8 @@ fn prepare_lights( mut images: ResMut>, rapier_context: Res, visibility_blocker_query: Query<&VisibilityBlocker>, + transform_query: Query<&GlobalTransform>, + collider_query: Query<&Collider>, material_query: Query<&Handle>, 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, visibility_blocker_query: &Query<&VisibilityBlocker>, - light: &impl LightAabb, + transform_query: &Query<&GlobalTransform>, + collider_query: &Query<&Collider>, + aabb: Rect, ) -> Vec { - 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 }