use crate::camera::Camera2d;
use crate::camera::Camera3d;
use crate::light::LightCollection;
use crate::resource::{GpuMesh2d, GpuMesh3d};
use crate::scene::{InstancesBuffer2d, InstancesBuffer3d, ObjectData2d, ObjectData3d};
use glamx::{Pose2, Pose3, Vec2, Vec3};
use std::any::Any;
pub struct RenderContext {
pub surface_format: wgpu::TextureFormat,
pub sample_count: u32,
pub viewport_width: u32,
pub viewport_height: u32,
}
pub trait GpuData: Any {
fn as_any(&self) -> &dyn Any;
fn as_any_mut(&mut self) -> &mut dyn Any;
}
pub trait Material3d {
fn create_gpu_data(&self) -> Box<dyn GpuData>;
fn begin_frame(&mut self) {}
fn prepare(
&mut self,
_pass: usize,
_transform: Pose3,
_scale: Vec3,
_camera: &mut dyn Camera3d,
_lights: &LightCollection,
_data: &ObjectData3d,
_gpu_data: &mut dyn GpuData,
_viewport_width: u32,
_viewport_height: u32,
) {
}
fn flush(&mut self) {}
fn render(
&mut self,
pass: usize,
transform: Pose3,
scale: Vec3,
camera: &mut dyn Camera3d,
lights: &LightCollection,
data: &ObjectData3d,
mesh: &mut GpuMesh3d,
instances: &mut InstancesBuffer3d,
gpu_data: &mut dyn GpuData,
render_pass: &mut wgpu::RenderPass<'_>,
context: &RenderContext,
);
}
pub struct RenderContext2d {
pub surface_format: wgpu::TextureFormat,
pub sample_count: u32,
pub viewport_width: u32,
pub viewport_height: u32,
}
pub struct RenderContext2dEncoder<'a> {
pub encoder: &'a mut wgpu::CommandEncoder,
pub color_view: &'a wgpu::TextureView,
pub surface_format: wgpu::TextureFormat,
pub sample_count: u32,
pub viewport_width: u32,
pub viewport_height: u32,
}
pub trait Material2d {
fn create_gpu_data(&self) -> Box<dyn GpuData>;
fn begin_frame(&mut self) {}
fn prepare(
&mut self,
_transform: Pose2,
_scale: Vec2,
_camera: &mut dyn Camera2d,
_data: &ObjectData2d,
_mesh: &mut GpuMesh2d,
_instances: &mut InstancesBuffer2d,
_gpu_data: &mut dyn GpuData,
_context: &RenderContext2d,
) {
}
fn flush(&mut self) {}
fn render(
&mut self,
transform: Pose2,
scale: Vec2,
camera: &mut dyn Camera2d,
data: &ObjectData2d,
mesh: &mut GpuMesh2d,
instances: &mut InstancesBuffer2d,
gpu_data: &mut dyn GpuData,
render_pass: &mut wgpu::RenderPass<'_>,
context: &RenderContext2d,
);
}