use std::ops::{Deref, DerefMut};
use bevy::{
ecs::{query::WorldQuery, system::SystemParam},
prelude::*,
};
use crate::{
frame::{AsImageHandle, Frame, GetFrame},
pixel_buffer::PixelBuffer,
};
mod queries {
#![allow(missing_docs)]
use super::*;
#[cfg(not(feature = "egui"))]
#[derive(WorldQuery)]
#[world_query(mutable, derive(Debug))]
pub struct PixelBuffers {
pub entity: Entity,
pub pixel_buffer: &'static mut PixelBuffer,
pub image_handle: &'static Handle<Image>,
}
#[cfg(feature = "egui")]
#[derive(WorldQuery)]
#[world_query(mutable, derive(Debug))]
pub struct PixelBuffers {
pub entity: Entity,
pub pixel_buffer: &'static mut PixelBuffer,
pub image_handle: &'static Handle<Image>,
pub egui_texture: Option<&'static crate::egui::EguiTexture>,
}
}
pub use queries::*;
impl AsImageHandle for crate::query::PixelBuffersReadOnlyItem<'_> {
fn as_image_hande(&self) -> &Handle<Image> {
self.image_handle
}
}
impl AsImageHandle for crate::query::PixelBuffersItem<'_> {
fn as_image_hande(&self) -> &Handle<Image> {
self.image_handle
}
}
#[derive(SystemParam)]
pub struct QueryPixelBuffer<'w, 's> {
pub(crate) query: Query<'w, 's, PixelBuffers>,
pub(crate) images: ResMut<'w, Assets<Image>>,
}
impl<'w, 's> Deref for QueryPixelBuffer<'w, 's> {
type Target = Query<'w, 's, PixelBuffers>;
fn deref(&self) -> &Self::Target {
&self.query
}
}
impl<'w, 's> DerefMut for QueryPixelBuffer<'w, 's> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.query
}
}
impl<'w, 's> QueryPixelBuffer<'w, 's> {
pub fn images(&mut self) -> &mut Assets<Image> {
&mut self.images
}
pub fn split(self) -> (Query<'w, 's, PixelBuffers>, ResMut<'w, Assets<Image>>) {
(self.query, self.images)
}
}
impl<'w, 's> GetFrame for QueryPixelBuffer<'w, 's> {
fn frame(&mut self) -> Frame<'_> {
let image_handle = self.query.single().image_handle;
Frame::extract(&mut self.images, image_handle)
}
}