From 40f45d7b7e35dd4937abe6b5ce16b6256b4f1eeb Mon Sep 17 00:00:00 2001 From: shan Date: Thu, 29 Sep 2022 10:52:58 -0700 Subject: Adds linear gradient support to 2D meshes in the canvas widget. --- examples/modern_art/src/main.rs | 141 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 examples/modern_art/src/main.rs (limited to 'examples/modern_art/src') diff --git a/examples/modern_art/src/main.rs b/examples/modern_art/src/main.rs new file mode 100644 index 00000000..17149cbe --- /dev/null +++ b/examples/modern_art/src/main.rs @@ -0,0 +1,141 @@ +use rand::{Rng, thread_rng}; +use crate::canvas::{Cursor, FillStyle, Geometry, Gradient}; +use iced::widget::canvas::{Cache, Fill, Frame}; +use iced::widget::{canvas, Canvas}; +use iced::Settings; +use iced::{ + executor, Application, Color, Command, Element, Length, Point, Rectangle, + Renderer, Size, Theme, +}; + +fn main() -> iced::Result { + ModernArt::run(Settings { + antialiasing: true, + ..Settings::default() + }) +} + +#[derive(Debug, Clone, Copy)] +enum Message {} + +struct ModernArt { + cache: Cache, +} + +impl Application for ModernArt { + type Executor = executor::Default; + type Message = Message; + type Theme = Theme; + type Flags = (); + + fn new(_flags: Self::Flags) -> (Self, Command) { + ( + ModernArt { + cache: Default::default(), + }, + Command::none(), + ) + } + + fn title(&self) -> String { + String::from("Modern Art") + } + + fn update(&mut self, _message: Self::Message) -> Command { + Command::none() + } + + fn view(&self) -> Element<'_, Self::Message, Renderer> { + Canvas::new(self) + .width(Length::Fill) + .height(Length::Fill) + .into() + } +} + +impl canvas::Program for ModernArt { + type State = (); + + fn draw( + &self, + _state: &Self::State, + _theme: &Theme, + bounds: Rectangle, + _cursor: Cursor, + ) -> Vec { + let geometry = self.cache.draw(bounds.size(), |frame| { + let num_squares = thread_rng().gen_range(0..1200); + + let mut i = 0; + while i <= num_squares { + generate_box(frame, bounds.size()); + i += 1; + } + }); + + vec![geometry] + } +} + +fn generate_box(frame: &mut Frame, bounds: Size) -> bool { + let solid = rand::random::(); + + let random_color = || -> Color { + Color::from_rgb( + thread_rng().gen_range(0.0..1.0), + thread_rng().gen_range(0.0..1.0), + thread_rng().gen_range(0.0..1.0), + ) + }; + + let gradient = |top_left: Point, bottom_right: Point| -> Gradient { + let mut builder = Gradient::linear(top_left, bottom_right); + let stops = thread_rng().gen_range(1..64u32); + + let mut i = 0; + while i <= stops { + builder = builder.add_stop( + i as f32 / stops as f32, + random_color() + ); + i += 1; + } + + builder.build().unwrap() + }; + + let top_left = Point::new( + thread_rng().gen_range(0.0..bounds.width), + thread_rng().gen_range(0.0..bounds.height) + ); + + let size = Size::new( + thread_rng().gen_range(50.0..200.0), + thread_rng().gen_range(50.0..200.0), + ); + + if solid { + frame.fill_rectangle( + top_left, + size, + Fill { + style: FillStyle::Solid(random_color()), + .. Default::default() + } + ); + } else { + frame.fill_rectangle( + top_left, + size, + Fill { + style: FillStyle::Gradient(&gradient( + top_left, + Point::new(top_left.x + size.width, top_left.y + size.height) + )), + .. Default::default() + } + ); + }; + + solid +} \ No newline at end of file -- cgit From e25f3d3dea2d2c1ba7d2778948443df2745084be Mon Sep 17 00:00:00 2001 From: shan Date: Thu, 29 Sep 2022 17:13:32 -0700 Subject: Fixed issue where OpenGL would not render both shaders at once under certain circumstances. --- examples/modern_art/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'examples/modern_art/src') diff --git a/examples/modern_art/src/main.rs b/examples/modern_art/src/main.rs index 17149cbe..7b04b581 100644 --- a/examples/modern_art/src/main.rs +++ b/examples/modern_art/src/main.rs @@ -90,7 +90,7 @@ fn generate_box(frame: &mut Frame, bounds: Size) -> bool { let gradient = |top_left: Point, bottom_right: Point| -> Gradient { let mut builder = Gradient::linear(top_left, bottom_right); - let stops = thread_rng().gen_range(1..64u32); + let stops = thread_rng().gen_range(1..10u32); let mut i = 0; while i <= stops { -- cgit From 5d0fffc626928177239336757507b986b081b878 Mon Sep 17 00:00:00 2001 From: shan Date: Fri, 30 Sep 2022 10:27:00 -0700 Subject: Fixed some importing issues since you can use a Shader::Gradient outside a Canvas widget, where it was previously only accessible. --- examples/modern_art/src/main.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'examples/modern_art/src') diff --git a/examples/modern_art/src/main.rs b/examples/modern_art/src/main.rs index 7b04b581..c7945012 100644 --- a/examples/modern_art/src/main.rs +++ b/examples/modern_art/src/main.rs @@ -1,5 +1,5 @@ use rand::{Rng, thread_rng}; -use crate::canvas::{Cursor, FillStyle, Geometry, Gradient}; +use crate::canvas::{Cursor, FillStyle, Geometry}; use iced::widget::canvas::{Cache, Fill, Frame}; use iced::widget::{canvas, Canvas}; use iced::Settings; @@ -7,6 +7,7 @@ use iced::{ executor, Application, Color, Command, Element, Length, Point, Rectangle, Renderer, Size, Theme, }; +use iced_graphics::gradient::Gradient; fn main() -> iced::Result { ModernArt::run(Settings { -- cgit From 6e7b3ced0b1daf368e44e181ecdb4ae529877eb6 Mon Sep 17 00:00:00 2001 From: shan Date: Tue, 4 Oct 2022 18:24:46 -0700 Subject: Reworked wgpu buffers, updated glow side to have proper transform location storage, attempting to fix visibility modifiers, implemented some of the feedback received in initial PR. --- examples/modern_art/src/main.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'examples/modern_art/src') diff --git a/examples/modern_art/src/main.rs b/examples/modern_art/src/main.rs index c7945012..238c9a0f 100644 --- a/examples/modern_art/src/main.rs +++ b/examples/modern_art/src/main.rs @@ -1,5 +1,5 @@ use rand::{Rng, thread_rng}; -use crate::canvas::{Cursor, FillStyle, Geometry}; +use crate::canvas::{Cursor, Geometry}; use iced::widget::canvas::{Cache, Fill, Frame}; use iced::widget::{canvas, Canvas}; use iced::Settings; @@ -8,6 +8,7 @@ use iced::{ Renderer, Size, Theme, }; use iced_graphics::gradient::Gradient; +use iced_graphics::widget::canvas::Style; fn main() -> iced::Result { ModernArt::run(Settings { @@ -120,7 +121,7 @@ fn generate_box(frame: &mut Frame, bounds: Size) -> bool { top_left, size, Fill { - style: FillStyle::Solid(random_color()), + style: Style::Solid(random_color()), .. Default::default() } ); @@ -129,7 +130,7 @@ fn generate_box(frame: &mut Frame, bounds: Size) -> bool { top_left, size, Fill { - style: FillStyle::Gradient(&gradient( + style: Style::Gradient(&gradient( top_left, Point::new(top_left.x + size.width, top_left.y + size.height) )), -- cgit From 30432cbade3d9b25c4df62656a7494db3f4ea82a Mon Sep 17 00:00:00 2001 From: shan Date: Wed, 5 Oct 2022 10:49:58 -0700 Subject: Readjusted namespaces, removed Geometry example as it's no longer relevant. --- examples/modern_art/src/main.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'examples/modern_art/src') diff --git a/examples/modern_art/src/main.rs b/examples/modern_art/src/main.rs index 238c9a0f..14e117b3 100644 --- a/examples/modern_art/src/main.rs +++ b/examples/modern_art/src/main.rs @@ -1,14 +1,13 @@ use rand::{Rng, thread_rng}; use crate::canvas::{Cursor, Geometry}; -use iced::widget::canvas::{Cache, Fill, Frame}; +use iced::widget::canvas::{Cache, Fill, Frame, Gradient}; use iced::widget::{canvas, Canvas}; use iced::Settings; use iced::{ executor, Application, Color, Command, Element, Length, Point, Rectangle, Renderer, Size, Theme, }; -use iced_graphics::gradient::Gradient; -use iced_graphics::widget::canvas::Style; +use iced_graphics::widget::canvas::fill; fn main() -> iced::Result { ModernArt::run(Settings { @@ -121,7 +120,7 @@ fn generate_box(frame: &mut Frame, bounds: Size) -> bool { top_left, size, Fill { - style: Style::Solid(random_color()), + style: fill::Style::Solid(random_color()), .. Default::default() } ); @@ -130,7 +129,7 @@ fn generate_box(frame: &mut Frame, bounds: Size) -> bool { top_left, size, Fill { - style: Style::Gradient(&gradient( + style: fill::Style::Gradient(&gradient( top_left, Point::new(top_left.x + size.width, top_left.y + size.height) )), -- cgit From 1eb8d972ba60592da7bfc27fe7ec80138e64dd7b Mon Sep 17 00:00:00 2001 From: shan Date: Wed, 5 Oct 2022 16:07:43 -0700 Subject: Reduced memory transfer of OpenGL gradient uniform upload. Rearranged gradient uniforms on OpenGL side to be more performant. --- examples/modern_art/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'examples/modern_art/src') diff --git a/examples/modern_art/src/main.rs b/examples/modern_art/src/main.rs index 14e117b3..a7aa2d8a 100644 --- a/examples/modern_art/src/main.rs +++ b/examples/modern_art/src/main.rs @@ -91,7 +91,7 @@ fn generate_box(frame: &mut Frame, bounds: Size) -> bool { let gradient = |top_left: Point, bottom_right: Point| -> Gradient { let mut builder = Gradient::linear(top_left, bottom_right); - let stops = thread_rng().gen_range(1..10u32); + let stops = thread_rng().gen_range(1..15u32); let mut i = 0; while i <= stops { -- cgit From cb7c4676543cd508dfae8d4dcbd9cc8b61b1a94e Mon Sep 17 00:00:00 2001 From: shan Date: Thu, 6 Oct 2022 07:28:05 -0700 Subject: Fixed lint issues & cleaned up some documentation. --- examples/modern_art/src/main.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'examples/modern_art/src') diff --git a/examples/modern_art/src/main.rs b/examples/modern_art/src/main.rs index a7aa2d8a..6a22b27f 100644 --- a/examples/modern_art/src/main.rs +++ b/examples/modern_art/src/main.rs @@ -1,13 +1,12 @@ use rand::{Rng, thread_rng}; use crate::canvas::{Cursor, Geometry}; -use iced::widget::canvas::{Cache, Fill, Frame, Gradient}; +use iced::widget::canvas::{Cache, Fill, Frame, Gradient, fill}; use iced::widget::{canvas, Canvas}; use iced::Settings; use iced::{ executor, Application, Color, Command, Element, Length, Point, Rectangle, Renderer, Size, Theme, }; -use iced_graphics::widget::canvas::fill; fn main() -> iced::Result { ModernArt::run(Settings { @@ -139,4 +138,4 @@ fn generate_box(frame: &mut Frame, bounds: Size) -> bool { }; solid -} \ No newline at end of file +} -- cgit From 9c7bf417ac9c1ac72bcc55aa3cd5e8eb962243a2 Mon Sep 17 00:00:00 2001 From: shan Date: Thu, 6 Oct 2022 16:57:38 -0700 Subject: Added support for gradients to respect current frame transform. --- examples/modern_art/src/main.rs | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) (limited to 'examples/modern_art/src') diff --git a/examples/modern_art/src/main.rs b/examples/modern_art/src/main.rs index 6a22b27f..0601fc44 100644 --- a/examples/modern_art/src/main.rs +++ b/examples/modern_art/src/main.rs @@ -1,12 +1,11 @@ -use rand::{Rng, thread_rng}; -use crate::canvas::{Cursor, Geometry}; -use iced::widget::canvas::{Cache, Fill, Frame, Gradient, fill}; -use iced::widget::{canvas, Canvas}; -use iced::Settings; +use iced::widget::canvas::{ + self, fill, Cache, Canvas, Cursor, Fill, Frame, Geometry, Gradient, +}; use iced::{ executor, Application, Color, Command, Element, Length, Point, Rectangle, - Renderer, Size, Theme, + Renderer, Size, Theme, Settings }; +use rand::{thread_rng, Rng}; fn main() -> iced::Result { ModernArt::run(Settings { @@ -41,7 +40,7 @@ impl Application for ModernArt { String::from("Modern Art") } - fn update(&mut self, _message: Self::Message) -> Command { + fn update(&mut self, _message: Message) -> Command { Command::none() } @@ -94,10 +93,7 @@ fn generate_box(frame: &mut Frame, bounds: Size) -> bool { let mut i = 0; while i <= stops { - builder = builder.add_stop( - i as f32 / stops as f32, - random_color() - ); + builder = builder.add_stop(i as f32 / stops as f32, random_color()); i += 1; } @@ -106,7 +102,7 @@ fn generate_box(frame: &mut Frame, bounds: Size) -> bool { let top_left = Point::new( thread_rng().gen_range(0.0..bounds.width), - thread_rng().gen_range(0.0..bounds.height) + thread_rng().gen_range(0.0..bounds.height), ); let size = Size::new( @@ -120,8 +116,8 @@ fn generate_box(frame: &mut Frame, bounds: Size) -> bool { size, Fill { style: fill::Style::Solid(random_color()), - .. Default::default() - } + ..Default::default() + }, ); } else { frame.fill_rectangle( @@ -130,10 +126,13 @@ fn generate_box(frame: &mut Frame, bounds: Size) -> bool { Fill { style: fill::Style::Gradient(&gradient( top_left, - Point::new(top_left.x + size.width, top_left.y + size.height) + Point::new( + top_left.x + size.width, + top_left.y + size.height, + ), )), - .. Default::default() - } + ..Default::default() + }, ); }; -- cgit From 12a87c54eb68b992676060c80e518ffb29445cfc Mon Sep 17 00:00:00 2001 From: shan Date: Fri, 7 Oct 2022 11:41:50 -0700 Subject: Added support for relative positioning of gradient fills. Addressed some PR feedback. --- examples/modern_art/src/main.rs | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) (limited to 'examples/modern_art/src') diff --git a/examples/modern_art/src/main.rs b/examples/modern_art/src/main.rs index 0601fc44..362e4ad1 100644 --- a/examples/modern_art/src/main.rs +++ b/examples/modern_art/src/main.rs @@ -1,5 +1,5 @@ use iced::widget::canvas::{ - self, fill, Cache, Canvas, Cursor, Fill, Frame, Geometry, Gradient, + self, Cache, Canvas, Cursor, Frame, Geometry, Gradient, Position, Location }; use iced::{ executor, Application, Color, Command, Element, Length, Point, Rectangle, @@ -76,6 +76,20 @@ impl canvas::Program for ModernArt { } } +fn random_direction() -> Location { + match thread_rng().gen_range(0..8) { + 0 => Location::TopLeft, + 1 => Location::Top, + 2 => Location::TopRight, + 3 => Location::Right, + 4 => Location::BottomRight, + 5 => Location::Bottom, + 6 => Location::BottomLeft, + 7 => Location::Left, + _ => Location::TopLeft + } +} + fn generate_box(frame: &mut Frame, bounds: Size) -> bool { let solid = rand::random::(); @@ -87,8 +101,13 @@ fn generate_box(frame: &mut Frame, bounds: Size) -> bool { ) }; - let gradient = |top_left: Point, bottom_right: Point| -> Gradient { - let mut builder = Gradient::linear(top_left, bottom_right); + let gradient = |top_left: Point, size: Size| -> Gradient { + let mut builder = Gradient::linear(Position::Relative { + top_left, + size, + start: random_direction(), + end: random_direction() + }); let stops = thread_rng().gen_range(1..15u32); let mut i = 0; @@ -114,25 +133,13 @@ fn generate_box(frame: &mut Frame, bounds: Size) -> bool { frame.fill_rectangle( top_left, size, - Fill { - style: fill::Style::Solid(random_color()), - ..Default::default() - }, + random_color(), ); } else { frame.fill_rectangle( top_left, size, - Fill { - style: fill::Style::Gradient(&gradient( - top_left, - Point::new( - top_left.x + size.width, - top_left.y + size.height, - ), - )), - ..Default::default() - }, + &gradient(top_left, size), ); }; -- cgit From 3e600fe7754645ffdfca595060273b1e96c9a162 Mon Sep 17 00:00:00 2001 From: shan Date: Fri, 7 Oct 2022 13:10:37 -0700 Subject: Adjusted reexports for clarity. --- examples/modern_art/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'examples/modern_art/src') diff --git a/examples/modern_art/src/main.rs b/examples/modern_art/src/main.rs index 362e4ad1..fc203cff 100644 --- a/examples/modern_art/src/main.rs +++ b/examples/modern_art/src/main.rs @@ -1,5 +1,5 @@ use iced::widget::canvas::{ - self, Cache, Canvas, Cursor, Frame, Geometry, Gradient, Position, Location + self, Cache, Canvas, Cursor, Frame, Geometry, Gradient, gradient::Position, gradient::Location }; use iced::{ executor, Application, Color, Command, Element, Length, Point, Rectangle, -- cgit From b95745340441835bd25b5cadc2342254631f8c05 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 3 Nov 2022 04:35:16 +0100 Subject: Run `cargo fmt` --- examples/modern_art/src/main.rs | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) (limited to 'examples/modern_art/src') diff --git a/examples/modern_art/src/main.rs b/examples/modern_art/src/main.rs index fc203cff..db9b0491 100644 --- a/examples/modern_art/src/main.rs +++ b/examples/modern_art/src/main.rs @@ -1,9 +1,10 @@ use iced::widget::canvas::{ - self, Cache, Canvas, Cursor, Frame, Geometry, Gradient, gradient::Position, gradient::Location + self, gradient::Location, gradient::Position, Cache, Canvas, Cursor, Frame, + Geometry, Gradient, }; use iced::{ executor, Application, Color, Command, Element, Length, Point, Rectangle, - Renderer, Size, Theme, Settings + Renderer, Settings, Size, Theme, }; use rand::{thread_rng, Rng}; @@ -86,7 +87,7 @@ fn random_direction() -> Location { 5 => Location::Bottom, 6 => Location::BottomLeft, 7 => Location::Left, - _ => Location::TopLeft + _ => Location::TopLeft, } } @@ -106,7 +107,7 @@ fn generate_box(frame: &mut Frame, bounds: Size) -> bool { top_left, size, start: random_direction(), - end: random_direction() + end: random_direction(), }); let stops = thread_rng().gen_range(1..15u32); @@ -130,17 +131,9 @@ fn generate_box(frame: &mut Frame, bounds: Size) -> bool { ); if solid { - frame.fill_rectangle( - top_left, - size, - random_color(), - ); + frame.fill_rectangle(top_left, size, random_color()); } else { - frame.fill_rectangle( - top_left, - size, - &gradient(top_left, size), - ); + frame.fill_rectangle(top_left, size, &gradient(top_left, size)); }; solid -- cgit From 84d1b79fefc88534835fdfbe79bc0eb3b43627cf Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 3 Nov 2022 05:50:53 +0100 Subject: Move `mesh::Style` to `triangle` and reuse it in `fill` and `stroke` --- examples/modern_art/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'examples/modern_art/src') diff --git a/examples/modern_art/src/main.rs b/examples/modern_art/src/main.rs index db9b0491..0dd21c74 100644 --- a/examples/modern_art/src/main.rs +++ b/examples/modern_art/src/main.rs @@ -133,7 +133,7 @@ fn generate_box(frame: &mut Frame, bounds: Size) -> bool { if solid { frame.fill_rectangle(top_left, size, random_color()); } else { - frame.fill_rectangle(top_left, size, &gradient(top_left, size)); + frame.fill_rectangle(top_left, size, gradient(top_left, size)); }; solid -- cgit