use glam::Mat4;
use crate::color::Color;
use crate::engine::Engine;
use crate::mesh3d::{Mesh3D, Mesh3DShader};
use crate::platform::types::TextureResource;
use crate::renderer::shader3d::draw3d::Draw3D;
pub struct ResolvedDraw3D {
pub draw: Draw3D,
pub texture: Option<TextureResource>,
}
pub struct Shader3DRunner {
mesh_shader: Mesh3DShader,
}
impl Shader3DRunner {
pub fn new(g: &Engine) -> Self {
Self {
mesh_shader: Mesh3DShader::new(g),
}
}
pub fn record(
&mut self,
g: &Engine,
color_target: &wgpu::Texture,
depth_view: &wgpu::TextureView,
draws: &[ResolvedDraw3D],
encoder: &mut wgpu::CommandEncoder,
should_clear: bool,
) {
if draws.is_empty() {
return;
}
self.mesh_shader.frame_start();
let size = color_target.size();
let aspect = if size.height == 0 {
1.0
} else {
size.width as f32 / size.height as f32
};
let view_proj = g.camera3d().view_proj(aspect);
#[allow(clippy::type_complexity)]
let tmp: Vec<(
&Mesh3D,
Mat4,
Option<&TextureResource>,
Color,
&crate::light3d::Material3D,
crate::mesh3d::DrawMode,
)> = draws
.iter()
.map(|d| {
(
&d.draw.mesh,
d.draw.model,
d.texture.as_ref(),
d.draw.color,
&d.draw.material,
d.draw.draw_mode,
)
})
.collect();
self.mesh_shader.record_to_encoder(
g,
color_target,
depth_view,
view_proj,
&tmp,
encoder,
should_clear,
);
}
}