mod node;
mod phase;
mod pipeline;
mod plugin;
mod prepare;
pub(super) mod prelude {
pub(super) use super::node::MeshLightNode;
pub(super) use super::phase::DrawMeshLight;
pub(crate) use super::phase::MeshLightPhase;
pub(super) use super::pipeline::MeshLightPipeline;
pub(crate) use super::plugin::{MeshLightLabel, MeshLightPlugin};
pub(crate) use super::prepare::MeshLightTextures;
pub(super) use super::prepare::MeshLightUniformBuffers;
pub(crate) use super::{AmbientLight2d, MeshLight};
pub(super) use super::{MeshLightFragmentBindGroups, SetMeshLightFragmentBindGroup};
}
use bevy::{
color::Color,
ecs::{
component::Component,
entity::Entity,
query::ROQueryItem,
resource::Resource,
system::{SystemParamItem, lifetimeless::SRes},
},
platform::collections::HashMap,
reflect::Reflect,
render::{
render_phase::{PhaseItem, RenderCommand, RenderCommandResult, TrackedRenderPass},
render_resource::BindGroup,
sync_world::SyncToRenderWorld,
view::{ExtractedView, RetainedViewEntity},
},
};
use crate::extract::prelude::*;
#[derive(Component, Reflect, Clone, Copy)]
#[require(SyncToRenderWorld)]
pub struct AmbientLight2d {
pub color: Color,
pub intensity: f32,
}
impl Default for AmbientLight2d {
fn default() -> Self {
Self {
color: Color::WHITE,
intensity: 1.,
}
}
}
#[derive(Component, Reflect, Clone, Copy)]
#[require(SyncToRenderWorld)]
pub struct MeshLight {
pub color: Color,
pub intensity: f32,
}
impl Default for MeshLight {
fn default() -> Self {
Self {
color: Color::WHITE,
intensity: 1.,
}
}
}
#[derive(Resource, Default)]
pub(super) struct MeshLightFragmentBindGroups(
pub(super) HashMap<(RetainedViewEntity, Entity), BindGroup>,
);
pub(super) struct SetMeshLightFragmentBindGroup<const I: usize>;
impl<P: PhaseItem, const I: usize> RenderCommand<P> for SetMeshLightFragmentBindGroup<I> {
type Param = SRes<MeshLightFragmentBindGroups>;
type ViewQuery = (&'static ExtractedView, &'static ExtractedAmbientLight2d);
type ItemQuery = ();
fn render<'w>(
item: &P,
(view, _): ROQueryItem<'w, '_, Self::ViewQuery>,
_entity: Option<()>,
bind_groups: SystemParamItem<'w, '_, Self::Param>,
pass: &mut TrackedRenderPass<'w>,
) -> RenderCommandResult {
let bind_groups = bind_groups.into_inner();
let Some(bind_group) = bind_groups
.0
.get(&(view.retained_view_entity, item.entity()))
else {
return RenderCommandResult::Skip;
};
pass.set_bind_group(I, &bind_group, &[]);
RenderCommandResult::Success
}
}