use bevy::asset::*;
use bevy::prelude::*;
use bevy::render::render_resource::{AsBindGroup, Extent3d, TextureDimension, TextureFormat};
use bevy_cef_core::prelude::*;
const WEBVIEW_UTIL_SHADER_HANDLE: Handle<Shader> =
uuid_handle!("6c7cb871-4208-4407-9c25-306c6f069e2b");
pub(super) struct WebviewMaterialPlugin;
impl Plugin for WebviewMaterialPlugin {
fn build(&self, app: &mut App) {
app.add_plugins(MaterialPlugin::<WebviewMaterial>::default())
.add_message::<RenderTextureMessage>()
.add_systems(Update, send_render_textures);
load_internal_asset!(
app,
WEBVIEW_UTIL_SHADER_HANDLE,
"./webview_util.wgsl",
Shader::from_wgsl
);
}
}
#[derive(Asset, TypePath, AsBindGroup, Debug, Clone, PartialEq, Eq, Hash, Default)]
pub struct WebviewMaterial {
#[texture(101)]
#[sampler(102)]
pub surface: Option<Handle<Image>>,
}
impl Material for WebviewMaterial {}
fn send_render_textures(mut ew: MessageWriter<RenderTextureMessage>, browsers: NonSend<Browsers>) {
while let Ok(texture) = browsers.try_receive_texture() {
ew.write(texture);
}
}
pub(crate) fn update_webview_image(texture: RenderTextureMessage, image: &mut Image) {
*image = Image::new(
Extent3d {
width: texture.width,
height: texture.height,
depth_or_array_layers: 1,
},
TextureDimension::D2,
texture.buffer,
TextureFormat::Bgra8UnormSrgb,
RenderAssetUsages::all(),
);
}