wip: added collider point collection
parent
3fbe81d388
commit
69c176ed88
|
|
@ -176,6 +176,8 @@ fn prepare_lights(
|
||||||
mut images: ResMut<Assets<Image>>,
|
mut images: ResMut<Assets<Image>>,
|
||||||
rapier_context: Res<RapierContext>,
|
rapier_context: Res<RapierContext>,
|
||||||
visibility_blocker_query: Query<&VisibilityBlocker>,
|
visibility_blocker_query: Query<&VisibilityBlocker>,
|
||||||
|
transform_query: Query<&GlobalTransform>,
|
||||||
|
collider_query: Query<&Collider>,
|
||||||
material_query: Query<&Handle<DarknessMaterial>>,
|
material_query: Query<&Handle<DarknessMaterial>>,
|
||||||
point_light_query: Query<(&GlobalTransform, &PointLight2D)>,
|
point_light_query: Query<(&GlobalTransform, &PointLight2D)>,
|
||||||
spot_light_query: Query<(&GlobalTransform, &SpotLight2D)>,
|
spot_light_query: Query<(&GlobalTransform, &SpotLight2D)>,
|
||||||
|
|
@ -201,7 +203,18 @@ fn prepare_lights(
|
||||||
.iter()
|
.iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.for_each(|(i, (transform, light))| {
|
.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 {
|
material.point_lights[i] = GpuPointLight2D {
|
||||||
position: transform.translation().truncate(),
|
position: transform.translation().truncate(),
|
||||||
radius: light.radius,
|
radius: light.radius,
|
||||||
|
|
@ -247,17 +260,46 @@ fn prepare_lights(
|
||||||
fn get_light_geometry(
|
fn get_light_geometry(
|
||||||
rapier_context: &Res<RapierContext>,
|
rapier_context: &Res<RapierContext>,
|
||||||
visibility_blocker_query: &Query<&VisibilityBlocker>,
|
visibility_blocker_query: &Query<&VisibilityBlocker>,
|
||||||
light: &impl LightAabb,
|
transform_query: &Query<&GlobalTransform>,
|
||||||
|
collider_query: &Query<&Collider>,
|
||||||
|
aabb: Rect,
|
||||||
) -> Vec<Vec2> {
|
) -> Vec<Vec2> {
|
||||||
let rect = light.aabb();
|
let mut points = vec![
|
||||||
let collider = Collider::cuboid(rect.half_size().x, rect.half_size().y);
|
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 mut filter = QueryFilter::new().exclude_sensors();
|
||||||
let predicate = |coll_entity| visibility_blocker_query.get(coll_entity).is_ok();
|
let predicate = |coll_entity| visibility_blocker_query.get(coll_entity).is_ok();
|
||||||
filter.predicate = Some(&predicate);
|
filter.predicate = Some(&predicate);
|
||||||
let mut colls = vec![];
|
|
||||||
rapier_context.intersections_with_shape(rect.center(), 0.0, &collider, filter, |coll| {
|
rapier_context.intersections_with_shape(aabb.center(), 0.0, &collider, filter, |coll| {
|
||||||
colls.push(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
|
true
|
||||||
});
|
});
|
||||||
vec![]
|
|
||||||
|
points.sort_unstable_by(|a, b| {
|
||||||
|
f32::atan2(a.y, a.x)
|
||||||
|
.partial_cmp(&f32::atan2(b.y, b.x))
|
||||||
|
.unwrap()
|
||||||
|
});
|
||||||
|
|
||||||
|
points
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue