rafx-plugins 0.0.16

Rendering framework built on an extensible asset pipeline
Documentation
use std::sync::Arc;

pub struct EguiDrawData {
    pub vertices: Vec<egui::epaint::Vertex>,
    pub indices: Vec<u16>,
    pub clipped_draw_calls: Vec<EguiClippedDrawCalls>,
    pub font_atlas: Arc<egui::Texture>,
    pub pixels_per_point: f32,
}

pub struct EguiDrawCall {
    pub texture_id: egui::TextureId,
    pub vertex_offset: usize,
    pub index_offset: usize,
    pub index_count: usize,
}

pub struct EguiClippedDrawCalls {
    pub clip_rect: egui::math::Rect,
    pub draw_calls: Vec<EguiDrawCall>,
}

impl EguiDrawData {
    pub fn try_create_new(
        clipped_meshes: Vec<egui::epaint::ClippedMesh>,
        font_atlas: Arc<egui::Texture>,
        pixels_per_point: f32,
    ) -> Option<Self> {
        let mut vertices = Vec::default();
        let mut indices = Vec::default();
        let mut all_clipped_draw_calls = Vec::default();

        for clipped_mesh in clipped_meshes {
            let min = clipped_mesh.0.min;
            let max = clipped_mesh.0.max;
            let mut clipped_draw_calls = EguiClippedDrawCalls {
                clip_rect: egui::Rect::from_min_max(
                    egui::Pos2 {
                        x: min.x * pixels_per_point as f32,
                        y: min.y * pixels_per_point as f32,
                    },
                    egui::Pos2 {
                        x: max.x * pixels_per_point as f32,
                        y: max.y * pixels_per_point as f32,
                    },
                ),
                draw_calls: vec![],
            };

            let meshes = clipped_mesh.1.split_to_u16();
            for mut mesh in meshes {
                if !mesh.indices.is_empty() {
                    let vertex_offset = vertices.len();
                    let index_offset = indices.len();
                    clipped_draw_calls.draw_calls.push(EguiDrawCall {
                        texture_id: mesh.texture_id,
                        vertex_offset,
                        index_offset,
                        index_count: mesh.indices.len(),
                    });
                    vertices.append(&mut mesh.vertices);
                    indices.append(&mut mesh.indices);
                }
            }

            all_clipped_draw_calls.push(clipped_draw_calls);
        }

        if vertices.len() > 1 {
            Some(EguiDrawData {
                vertices,
                indices,
                clipped_draw_calls: all_clipped_draw_calls,
                font_atlas,
                pixels_per_point,
            })
        } else {
            None
        }
    }

    pub fn draw_lists(&self) -> &[EguiClippedDrawCalls] {
        &self.clipped_draw_calls
    }
}