use super::App;
use crate::pipeline::{renderer_callback::RendererCallback, ui_gpu};
use gled_gpu::scene_render::{EvalContext, ensure_project_matrix_pipelines, render_matrices};
use gled_svg::fixture_preview::{self, IndexMap};
use wgpu::CommandEncoderDescriptor;
impl App {
#[cfg_attr(feature = "profiling", profiling::function)]
pub(super) fn render_thumbnails_and_preview(&mut self) {
let gpu = ui_gpu();
let mut encoder = gpu
.device
.create_command_encoder(&CommandEncoderDescriptor {
label: Some("Render thumbnails and preview"),
});
if let Some(project) = &self.project {
ensure_project_matrix_pipelines(
project,
&mut self.thumbnails,
&gpu,
&self.model.replica.assets,
);
render_matrices(
project,
&mut self.thumbnails,
&gpu,
&mut encoder,
&self.timing.beat_state(),
EvalContext {
patch: &project.patch,
collections: &self.model.replica.assets,
sound: &*self.model.sound,
},
);
self.thumbnail_textures.sync(&self.thumbnails);
}
let latest_output = self.model.preview.take();
match (self.project.is_some(), latest_output) {
(true, Some(output)) => {
self.ui_preview.preview.upload_output(&gpu.queue, &output);
self.preview_has_output = true;
}
(false, _) if self.preview_has_output => {
self.ui_preview.preview.clear_output(&gpu.queue);
self.preview_has_output = false;
}
_ => {}
}
let (project, collections) = (&self.project, &self.model.replica.assets);
self.ui_preview
.indices
.prepare(&gpu.queue, || match project {
Some(project) => fixture_preview::build(&project.patch, collections),
None => IndexMap::default(),
});
self.ui_preview.preview.run(&mut encoder);
RendererCallback::try_add(encoder.finish());
}
}