zed/crates/gpui3/src/scene.rs

113 lines
2.6 KiB
Rust
Raw Normal View History

2023-09-19 19:19:22 +00:00
use super::{Bounds, Hsla, Pixels, Point};
2023-09-24 22:52:33 +00:00
use crate::{Corners, Edges};
2023-09-19 19:19:22 +00:00
use bytemuck::{Pod, Zeroable};
2023-09-24 22:52:33 +00:00
use collections::BTreeMap;
2023-09-19 19:19:22 +00:00
// Exported to metal
pub type PointF = Point<f32>;
2023-09-19 19:19:22 +00:00
pub struct Scene {
2023-09-24 22:52:33 +00:00
layers: BTreeMap<u32, SceneLayer>,
2023-09-23 20:20:07 +00:00
scale_factor: f32,
2023-09-19 19:19:22 +00:00
}
2023-09-24 22:52:33 +00:00
#[derive(Default)]
pub struct SceneLayer {
pub quads: Vec<Quad>,
}
2023-09-19 19:19:22 +00:00
impl Scene {
2023-09-23 20:20:07 +00:00
pub fn new(scale_factor: f32) -> Scene {
2023-09-19 19:19:22 +00:00
Scene {
2023-09-24 22:52:33 +00:00
layers: Default::default(),
2023-09-23 20:20:07 +00:00
scale_factor,
2023-09-19 19:19:22 +00:00
}
}
pub fn insert(&mut self, primitive: impl Into<Primitive>) {
2023-09-23 20:20:07 +00:00
let mut primitive = primitive.into();
primitive.scale(self.scale_factor);
2023-09-24 22:52:33 +00:00
let layer = self.layers.entry(primitive.order()).or_default();
match primitive {
2023-09-24 22:52:33 +00:00
Primitive::Quad(quad) => layer.quads.push(quad),
2023-09-19 19:19:22 +00:00
}
}
2023-09-24 22:52:33 +00:00
pub fn layers(&self) -> impl Iterator<Item = &SceneLayer> {
self.layers.values()
}
2023-09-19 19:19:22 +00:00
}
#[derive(Clone, Debug)]
pub enum Primitive {
Quad(Quad),
}
impl Primitive {
pub fn order(&self) -> u32 {
match self {
Primitive::Quad(quad) => quad.order,
}
}
2023-09-19 19:19:22 +00:00
pub fn is_transparent(&self) -> bool {
match self {
Primitive::Quad(quad) => {
quad.background.is_transparent() && quad.border_color.is_transparent()
}
2023-09-23 20:20:07 +00:00
}
}
pub fn scale(&mut self, factor: f32) {
match self {
Primitive::Quad(quad) => {
quad.scale(factor);
}
2023-09-19 19:19:22 +00:00
}
}
}
#[derive(Debug, Clone, Copy, Zeroable, Pod)]
2023-09-19 19:19:22 +00:00
#[repr(C)]
pub struct Quad {
pub order: u32,
2023-09-19 19:19:22 +00:00
pub bounds: Bounds<Pixels>,
2023-09-22 22:31:26 +00:00
pub clip_bounds: Bounds<Pixels>,
pub clip_corner_radii: Corners<Pixels>,
2023-09-19 19:19:22 +00:00
pub background: Hsla,
pub border_color: Hsla,
2023-09-22 22:31:26 +00:00
pub corner_radii: Corners<Pixels>,
pub border_widths: Edges<Pixels>,
2023-09-19 19:19:22 +00:00
}
impl Quad {
pub fn vertices(&self) -> impl Iterator<Item = Point<Pixels>> {
let x1 = self.bounds.origin.x;
let y1 = self.bounds.origin.y;
let x2 = x1 + self.bounds.size.width;
let y2 = y1 + self.bounds.size.height;
[
Point::new(x1, y1),
Point::new(x2, y1),
Point::new(x2, y2),
Point::new(x1, y2),
]
.into_iter()
}
2023-09-23 20:20:07 +00:00
pub fn scale(&mut self, factor: f32) {
self.bounds.origin *= factor;
self.bounds.size *= factor;
self.clip_bounds.origin *= factor;
self.clip_corner_radii *= factor;
self.corner_radii *= factor;
self.border_widths *= factor;
2023-09-19 19:19:22 +00:00
}
}
2023-09-23 20:20:07 +00:00
impl From<Quad> for Primitive {
fn from(quad: Quad) -> Self {
Primitive::Quad(quad)
2023-09-19 19:19:22 +00:00
}
}