gled-ui 2.31.2

gled's egui interface, shared by the desktop app and the browser
Documentation
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 {
    /// Render the effect thumbnails and the LED
    /// preview on the UI device. The commands are submitted by egui's paint
    /// through `RendererCallback`, so they never race the window surface.
    #[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());
    }
}