From 59b1e90661ee9e479f404bae71029db824cc7b46 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 28 Apr 2020 03:18:31 +0200 Subject: Introduce `Translate` primitive in `iced_wgpu` --- wgpu/src/widget/canvas.rs | 24 ++++++++++++------------ wgpu/src/widget/canvas/cache.rs | 12 +++++++++--- wgpu/src/widget/canvas/frame.rs | 12 ++++++------ wgpu/src/widget/canvas/geometry.rs | 15 ++++++++++----- 4 files changed, 37 insertions(+), 26 deletions(-) (limited to 'wgpu/src/widget') diff --git a/wgpu/src/widget/canvas.rs b/wgpu/src/widget/canvas.rs index 2b485e18..744d901e 100644 --- a/wgpu/src/widget/canvas.rs +++ b/wgpu/src/widget/canvas.rs @@ -10,7 +10,7 @@ use crate::{Defaults, Primitive, Renderer}; use iced_native::{ input::mouse, layout, Clipboard, Element, Hasher, Layout, Length, - MouseCursor, Point, Size, Widget, + MouseCursor, Point, Size, Vector, Widget, }; use std::hash::Hash; @@ -190,20 +190,20 @@ impl Widget for Canvas { _cursor_position: Point, ) -> (Primitive, MouseCursor) { let bounds = layout.bounds(); - let origin = Point::new(bounds.x, bounds.y); + let translation = Vector::new(bounds.x, bounds.y); let size = Size::new(bounds.width, bounds.height); ( - Primitive::Group { - primitives: self - .state - .draw(size) - .into_iter() - .map(|geometry| Primitive::Cached { - origin, - cache: geometry.into_primitive(), - }) - .collect(), + Primitive::Translate { + translation, + content: Box::new(Primitive::Group { + primitives: self + .state + .draw(size) + .into_iter() + .map(Geometry::into_primitive) + .collect(), + }), }, MouseCursor::Idle, ) diff --git a/wgpu/src/widget/canvas/cache.rs b/wgpu/src/widget/canvas/cache.rs index 310bc1d3..12cc6442 100644 --- a/wgpu/src/widget/canvas/cache.rs +++ b/wgpu/src/widget/canvas/cache.rs @@ -57,21 +57,27 @@ impl Cache { if let State::Filled { bounds, primitive } = self.state.borrow().deref() { if *bounds == new_bounds { - return Geometry::from_primitive(primitive.clone()); + return Geometry::from_primitive(Primitive::Cached { + cache: primitive.clone(), + }); } } let mut frame = Frame::new(new_bounds); input.draw(&mut frame); - let primitive = Arc::new(frame.into_primitive()); + let primitive = { + let geometry = frame.into_geometry(); + + Arc::new(geometry.into_primitive()) + }; *self.state.borrow_mut() = State::Filled { bounds: new_bounds, primitive: primitive.clone(), }; - Geometry::from_primitive(primitive) + Geometry::from_primitive(Primitive::Cached { cache: primitive }) } pub fn with<'a, T>(&'a self, input: T) -> impl crate::canvas::State + 'a diff --git a/wgpu/src/widget/canvas/frame.rs b/wgpu/src/widget/canvas/frame.rs index a951a029..8623ce4d 100644 --- a/wgpu/src/widget/canvas/frame.rs +++ b/wgpu/src/widget/canvas/frame.rs @@ -1,7 +1,7 @@ use iced_native::{Point, Rectangle, Size, Vector}; use crate::{ - canvas::{Fill, Path, Stroke, Text}, + canvas::{Fill, Geometry, Path, Stroke, Text}, triangle, Primitive, }; @@ -260,13 +260,13 @@ impl Frame { self.transforms.current.is_identity = false; } - /// Produces the primitive representing everything drawn on the [`Frame`]. + /// Produces the [`Geometry`] representing everything drawn on the [`Frame`]. /// /// [`Frame`]: struct.Frame.html - pub fn into_primitive(mut self) -> Primitive { + /// [`Geometry`]: struct.Geometry.html + pub fn into_geometry(mut self) -> Geometry { if !self.buffers.indices.is_empty() { self.primitives.push(Primitive::Mesh2D { - origin: Point::ORIGIN, buffers: triangle::Mesh2D { vertices: self.buffers.vertices, indices: self.buffers.indices, @@ -274,9 +274,9 @@ impl Frame { }); } - Primitive::Group { + Geometry::from_primitive(Primitive::Group { primitives: self.primitives, - } + }) } } diff --git a/wgpu/src/widget/canvas/geometry.rs b/wgpu/src/widget/canvas/geometry.rs index db7b4054..12ef828f 100644 --- a/wgpu/src/widget/canvas/geometry.rs +++ b/wgpu/src/widget/canvas/geometry.rs @@ -1,15 +1,20 @@ use crate::Primitive; -use std::sync::Arc; -#[derive(Debug)] -pub struct Geometry(Arc); +#[derive(Debug, Clone)] +pub struct Geometry(Primitive); impl Geometry { - pub(crate) fn from_primitive(primitive: Arc) -> Self { + pub(crate) fn from_primitive(primitive: Primitive) -> Self { Self(primitive) } - pub(crate) fn into_primitive(self) -> Arc { + pub fn into_primitive(self) -> Primitive { self.0 } } + +impl From for Primitive { + fn from(geometry: Geometry) -> Primitive { + geometry.0 + } +} -- cgit