started working on shadows
parent
9056e8350b
commit
3fbe81d388
|
|
@ -8,6 +8,7 @@ use bevy::{
|
||||||
sprite::{Material2dPlugin, Mesh2dHandle},
|
sprite::{Material2dPlugin, Mesh2dHandle},
|
||||||
};
|
};
|
||||||
use bevy_ecs_ldtk::{LdtkLevel, LevelEvent};
|
use bevy_ecs_ldtk::{LdtkLevel, LevelEvent};
|
||||||
|
use bevy_rapier2d::prelude::{Collider, QueryFilter, RapierContext};
|
||||||
|
|
||||||
mod material;
|
mod material;
|
||||||
|
|
||||||
|
|
@ -173,6 +174,8 @@ fn add_to_level(
|
||||||
fn prepare_lights(
|
fn prepare_lights(
|
||||||
mut materials: ResMut<Assets<DarknessMaterial>>,
|
mut materials: ResMut<Assets<DarknessMaterial>>,
|
||||||
mut images: ResMut<Assets<Image>>,
|
mut images: ResMut<Assets<Image>>,
|
||||||
|
rapier_context: Res<RapierContext>,
|
||||||
|
visibility_blocker_query: Query<&VisibilityBlocker>,
|
||||||
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)>,
|
||||||
|
|
@ -198,6 +201,7 @@ 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);
|
||||||
material.point_lights[i] = GpuPointLight2D {
|
material.point_lights[i] = GpuPointLight2D {
|
||||||
position: transform.translation().truncate(),
|
position: transform.translation().truncate(),
|
||||||
radius: light.radius,
|
radius: light.radius,
|
||||||
|
|
@ -239,3 +243,21 @@ fn prepare_lights(
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_light_geometry(
|
||||||
|
rapier_context: &Res<RapierContext>,
|
||||||
|
visibility_blocker_query: &Query<&VisibilityBlocker>,
|
||||||
|
light: &impl LightAabb,
|
||||||
|
) -> Vec<Vec2> {
|
||||||
|
let rect = light.aabb();
|
||||||
|
let collider = Collider::cuboid(rect.half_size().x, rect.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);
|
||||||
|
true
|
||||||
|
});
|
||||||
|
vec![]
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue