diff options
Diffstat (limited to 'graphics/src/layer.rs')
-rw-r--r-- | graphics/src/layer.rs | 92 |
1 files changed, 30 insertions, 62 deletions
diff --git a/graphics/src/layer.rs b/graphics/src/layer.rs index 6aca738e..7dce1d4c 100644 --- a/graphics/src/layer.rs +++ b/graphics/src/layer.rs @@ -11,35 +11,23 @@ use crate::{ #[derive(Debug, Clone)] pub struct Layer<'a> { /// The clipping bounds of the [`Layer`]. - /// - /// [`Layer`]: struct.Layer.html pub bounds: Rectangle, /// The quads of the [`Layer`]. - /// - /// [`Layer`]: struct.Layer.html pub quads: Vec<Quad>, /// The triangle meshes of the [`Layer`]. - /// - /// [`Layer`]: struct.Layer.html pub meshes: Vec<Mesh<'a>>, /// The text of the [`Layer`]. - /// - /// [`Layer`]: struct.Layer.html pub text: Vec<Text<'a>>, /// The images of the [`Layer`]. - /// - /// [`Layer`]: struct.Layer.html pub images: Vec<Image>, } impl<'a> Layer<'a> { /// Creates a new [`Layer`] with the given clipping bounds. - /// - /// [`Layer`]: struct.Layer.html pub fn new(bounds: Rectangle) -> Self { Self { bounds, @@ -53,8 +41,6 @@ impl<'a> Layer<'a> { /// Creates a new [`Layer`] for the provided overlay text. /// /// This can be useful for displaying debug information. - /// - /// [`Layer`]: struct.Layer.html pub fn overlay(lines: &'a [impl AsRef<str>], viewport: &Viewport) -> Self { let mut overlay = Layer::new(Rectangle::with_size(viewport.logical_size())); @@ -87,8 +73,6 @@ impl<'a> Layer<'a> { /// Distributes the given [`Primitive`] and generates a list of layers based /// on its contents. - /// - /// [`Primitive`]: ../enum.Primitive.html pub fn generate( primitive: &'a Primitive, viewport: &Viewport, @@ -98,7 +82,12 @@ impl<'a> Layer<'a> { let mut layers = vec![first_layer]; - Self::process_primitive(&mut layers, Vector::new(0.0, 0.0), primitive); + Self::process_primitive( + &mut layers, + Vector::new(0.0, 0.0), + primitive, + 0, + ); layers } @@ -107,13 +96,19 @@ impl<'a> Layer<'a> { layers: &mut Vec<Self>, translation: Vector, primitive: &'a Primitive, + current_layer: usize, ) { match primitive { Primitive::None => {} Primitive::Group { primitives } => { // TODO: Inspect a bit and regroup (?) for primitive in primitives { - Self::process_primitive(layers, translation, primitive) + Self::process_primitive( + layers, + translation, + primitive, + current_layer, + ) } } Primitive::Text { @@ -125,7 +120,7 @@ impl<'a> Layer<'a> { horizontal_alignment, vertical_alignment, } => { - let layer = layers.last_mut().unwrap(); + let layer = &mut layers[current_layer]; layer.text.push(Text { content, @@ -144,7 +139,7 @@ impl<'a> Layer<'a> { border_width, border_color, } => { - let layer = layers.last_mut().unwrap(); + let layer = &mut layers[current_layer]; // TODO: Move some of these computations to the GPU (?) layer.quads.push(Quad { @@ -156,13 +151,13 @@ impl<'a> Layer<'a> { color: match background { Background::Color(color) => color.into_linear(), }, - border_radius: *border_radius as f32, - border_width: *border_width as f32, + border_radius: *border_radius, + border_width: *border_width, border_color: border_color.into_linear(), }); } Primitive::Mesh2D { buffers, size } => { - let layer = layers.last_mut().unwrap(); + let layer = &mut layers[current_layer]; let bounds = Rectangle::new( Point::new(translation.x, translation.y), @@ -183,7 +178,7 @@ impl<'a> Layer<'a> { offset, content, } => { - let layer = layers.last_mut().unwrap(); + let layer = &mut layers[current_layer]; let translated_bounds = *bounds + translation; // Only draw visible content @@ -191,16 +186,15 @@ impl<'a> Layer<'a> { layer.bounds.intersection(&translated_bounds) { let clip_layer = Layer::new(clip_bounds); - let new_layer = Layer::new(layer.bounds); - layers.push(clip_layer); + Self::process_primitive( layers, translation - Vector::new(offset.x as f32, offset.y as f32), content, + layers.len() - 1, ); - layers.push(new_layer); } } Primitive::Translate { @@ -211,13 +205,19 @@ impl<'a> Layer<'a> { layers, translation + *new_translation, &content, + current_layer, ); } Primitive::Cached { cache } => { - Self::process_primitive(layers, translation, &cache); + Self::process_primitive( + layers, + translation, + &cache, + current_layer, + ); } Primitive::Image { handle, bounds } => { - let layer = layers.last_mut().unwrap(); + let layer = &mut layers[current_layer]; layer.images.push(Image::Raster { handle: handle.clone(), @@ -225,7 +225,7 @@ impl<'a> Layer<'a> { }); } Primitive::Svg { handle, bounds } => { - let layer = layers.last_mut().unwrap(); + let layer = &mut layers[current_layer]; layer.images.push(Image::Vector { handle: handle.clone(), @@ -243,33 +243,21 @@ impl<'a> Layer<'a> { #[repr(C)] pub struct Quad { /// The position of the [`Quad`]. - /// - /// [`Quad`]: struct.Quad.html pub position: [f32; 2], /// The size of the [`Quad`]. - /// - /// [`Quad`]: struct.Quad.html pub size: [f32; 2], /// The color of the [`Quad`], in __linear RGB__. - /// - /// [`Quad`]: struct.Quad.html pub color: [f32; 4], /// The border color of the [`Quad`], in __linear RGB__. - /// - /// [`Quad`]: struct.Quad.html pub border_color: [f32; 4], /// The border radius of the [`Quad`]. - /// - /// [`Quad`]: struct.Quad.html pub border_radius: f32, /// The border width of the [`Quad`]. - /// - /// [`Quad`]: struct.Quad.html pub border_width: f32, } @@ -277,18 +265,12 @@ pub struct Quad { #[derive(Debug, Clone, Copy)] pub struct Mesh<'a> { /// The origin of the vertices of the [`Mesh`]. - /// - /// [`Mesh`]: struct.Mesh.html pub origin: Point, /// The vertex and index buffers of the [`Mesh`]. - /// - /// [`Mesh`]: struct.Mesh.html pub buffers: &'a triangle::Mesh2D, /// The clipping bounds of the [`Mesh`]. - /// - /// [`Mesh`]: struct.Mesh.html pub clip_bounds: Rectangle<f32>, } @@ -296,38 +278,24 @@ pub struct Mesh<'a> { #[derive(Debug, Clone, Copy)] pub struct Text<'a> { /// The content of the [`Text`]. - /// - /// [`Text`]: struct.Text.html pub content: &'a str, /// The layout bounds of the [`Text`]. - /// - /// [`Text`]: struct.Text.html pub bounds: Rectangle, /// The color of the [`Text`], in __linear RGB_. - /// - /// [`Text`]: struct.Text.html pub color: [f32; 4], /// The size of the [`Text`]. - /// - /// [`Text`]: struct.Text.html pub size: f32, /// The font of the [`Text`]. - /// - /// [`Text`]: struct.Text.html pub font: Font, /// The horizontal alignment of the [`Text`]. - /// - /// [`Text`]: struct.Text.html pub horizontal_alignment: HorizontalAlignment, /// The vertical alignment of the [`Text`]. - /// - /// [`Text`]: struct.Text.html pub vertical_alignment: VerticalAlignment, } |