use std::fmt::Debug;
pub mod gizmos;
pub use gizmos::Gizmos;
pub mod color_mesh;
pub use color_mesh::ColorMeshRenderer;
pub mod ui_rect;
pub use ui_rect::UiRectRenderer;
pub mod world_rect;
pub use world_rect::WorldRectRenderer;
pub mod text_renderer;
pub use text_renderer::TextRenderer;
use crate::{
app::{ModuleId, UntypedHandle},
Handle, Module,
};
pub trait MainPassRenderer {
fn render<'encoder>(&'encoder self, render_pass: &mut wgpu::RenderPass<'encoder>);
}
pub(super) struct MainPassRendererHandle {
module_id: ModuleId,
handle: UntypedHandle,
render_fn: fn(*const (), render_pass: *const ()) -> (),
}
impl Debug for MainPassRendererHandle {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("MainPassRendererHandle")
.field("module_id", &self.module_id)
.finish()
}
}
impl MainPassRendererHandle {
pub fn new<R: MainPassRenderer + Module>(handle: Handle<R>) -> Self {
return MainPassRendererHandle {
module_id: ModuleId::of::<R>(),
handle: handle.untyped(),
render_fn: render::<R>,
};
fn render<R: MainPassRenderer>(obj: *const (), render_pass: *const ()) {
unsafe {
<R as MainPassRenderer>::render(
&*(obj as *const R),
&mut *(render_pass as *mut wgpu::RenderPass<'_>),
);
}
}
}
pub fn render<'encoder>(&self, render_pass: &mut wgpu::RenderPass<'encoder>) {
let obj_ptr = self.handle.ptr();
let render_pass_ptr = render_pass as *const wgpu::RenderPass<'encoder> as *const ();
(self.render_fn)(obj_ptr, render_pass_ptr);
}
}