summaryrefslogtreecommitdiffstats
path: root/renderer/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--renderer/src/lib.rs44
-rw-r--r--renderer/src/widget.rs2
-rw-r--r--widget/src/shader.rs (renamed from renderer/src/widget/shader.rs)82
-rw-r--r--widget/src/shader/event.rs (renamed from renderer/src/widget/shader/event.rs)1
-rw-r--r--widget/src/shader/program.rs (renamed from renderer/src/widget/shader/program.rs)10
5 files changed, 71 insertions, 68 deletions
diff --git a/renderer/src/lib.rs b/renderer/src/lib.rs
index e4b1eda9..1fc4c86b 100644
--- a/renderer/src/lib.rs
+++ b/renderer/src/lib.rs
@@ -1,13 +1,15 @@
#![forbid(rust_2018_idioms)]
#![deny(unsafe_code, unused_results, rustdoc::broken_intra_doc_links)]
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
+#[cfg(feature = "wgpu")]
+pub use iced_wgpu as wgpu;
+
pub mod compositor;
#[cfg(feature = "geometry")]
pub mod geometry;
mod settings;
-pub mod widget;
pub use iced_graphics as graphics;
pub use iced_graphics::core;
@@ -60,26 +62,6 @@ impl<T> Renderer<T> {
}
}
}
-
- pub fn draw_custom<P: widget::shader::Primitive>(
- &mut self,
- bounds: Rectangle,
- primitive: P,
- ) {
- match self {
- Renderer::TinySkia(_) => {
- log::warn!(
- "Custom shader primitive is unavailable with tiny-skia."
- );
- }
- #[cfg(feature = "wgpu")]
- Renderer::Wgpu(renderer) => {
- renderer.draw_primitive(iced_wgpu::Primitive::Custom(
- iced_wgpu::primitive::Custom::shader(bounds, primitive),
- ));
- }
- }
- }
}
impl<T> core::Renderer for Renderer<T> {
@@ -292,3 +274,23 @@ impl<T> crate::graphics::geometry::Renderer for Renderer<T> {
}
}
}
+
+#[cfg(feature = "wgpu")]
+impl<T> iced_wgpu::primitive::pipeline::Renderer for Renderer<T> {
+ fn draw_pipeline_primitive(
+ &mut self,
+ bounds: Rectangle,
+ primitive: impl wgpu::primitive::pipeline::Primitive,
+ ) {
+ match self {
+ Self::TinySkia(_renderer) => {
+ log::warn!(
+ "Custom shader primitive is unavailable with tiny-skia."
+ );
+ }
+ Self::Wgpu(renderer) => {
+ renderer.draw_pipeline_primitive(bounds, primitive);
+ }
+ }
+ }
+}
diff --git a/renderer/src/widget.rs b/renderer/src/widget.rs
deleted file mode 100644
index 4b7dad5d..00000000
--- a/renderer/src/widget.rs
+++ /dev/null
@@ -1,2 +0,0 @@
-#[cfg(feature = "wgpu")]
-pub mod shader;
diff --git a/renderer/src/widget/shader.rs b/widget/src/shader.rs
index e218f35a..9d482537 100644
--- a/renderer/src/widget/shader.rs
+++ b/widget/src/shader.rs
@@ -1,25 +1,24 @@
//! A custom shader widget for wgpu applications.
-use crate::core::event::Status;
-use crate::core::layout::{Limits, Node};
-use crate::core::mouse::{Cursor, Interaction};
-use crate::core::renderer::Style;
-use crate::core::widget::tree::{State, Tag};
-use crate::core::widget::{tree, Tree};
-use crate::core::{
- self, layout, mouse, widget, window, Clipboard, Element, Layout, Length,
- Rectangle, Shell, Size, Widget,
-};
-use std::marker::PhantomData;
-
mod event;
mod program;
pub use event::Event;
-pub use iced_graphics::Transformation;
-pub use iced_wgpu::custom::Primitive;
-pub use iced_wgpu::custom::Storage;
pub use program::Program;
+use crate::core;
+use crate::core::layout::{self, Layout};
+use crate::core::mouse;
+use crate::core::renderer;
+use crate::core::widget::tree::{self, Tree};
+use crate::core::widget::{self, Widget};
+use crate::core::window;
+use crate::core::{Clipboard, Element, Length, Rectangle, Shell, Size};
+use crate::renderer::wgpu::primitive::pipeline;
+
+use std::marker::PhantomData;
+
+pub use pipeline::{Primitive, Storage};
+
/// A widget which can render custom shaders with Iced's `wgpu` backend.
///
/// Must be initialized with a [`Program`], which describes the internal widget state & how
@@ -56,17 +55,17 @@ impl<Message, P: Program<Message>> Shader<Message, P> {
}
}
-impl<P, Message, Theme> Widget<Message, crate::Renderer<Theme>>
- for Shader<Message, P>
+impl<P, Message, Renderer> Widget<Message, Renderer> for Shader<Message, P>
where
P: Program<Message>,
+ Renderer: pipeline::Renderer,
{
- fn tag(&self) -> Tag {
+ fn tag(&self) -> tree::Tag {
struct Tag<T>(T);
tree::Tag::of::<Tag<P::State>>()
}
- fn state(&self) -> State {
+ fn state(&self) -> tree::State {
tree::State::new(P::State::default())
}
@@ -81,9 +80,9 @@ where
fn layout(
&self,
_tree: &mut Tree,
- _renderer: &crate::Renderer<Theme>,
- limits: &Limits,
- ) -> Node {
+ _renderer: &Renderer,
+ limits: &layout::Limits,
+ ) -> layout::Node {
let limits = limits.width(self.width).height(self.height);
let size = limits.resolve(Size::ZERO);
@@ -95,12 +94,12 @@ where
tree: &mut Tree,
event: crate::core::Event,
layout: Layout<'_>,
- cursor: Cursor,
- _renderer: &crate::Renderer<Theme>,
+ cursor: mouse::Cursor,
+ _renderer: &Renderer,
_clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
_viewport: &Rectangle,
- ) -> Status {
+ ) -> event::Status {
let bounds = layout.bounds();
let custom_shader_event = match event {
@@ -140,9 +139,9 @@ where
&self,
tree: &Tree,
layout: Layout<'_>,
- cursor: Cursor,
+ cursor: mouse::Cursor,
_viewport: &Rectangle,
- _renderer: &crate::Renderer<Theme>,
+ _renderer: &Renderer,
) -> mouse::Interaction {
let bounds = layout.bounds();
let state = tree.state.downcast_ref::<P::State>();
@@ -153,9 +152,9 @@ where
fn draw(
&self,
tree: &widget::Tree,
- renderer: &mut crate::Renderer<Theme>,
- _theme: &Theme,
- _style: &Style,
+ renderer: &mut Renderer,
+ _theme: &Renderer::Theme,
+ _style: &renderer::Style,
layout: Layout<'_>,
cursor_position: mouse::Cursor,
_viewport: &Rectangle,
@@ -163,20 +162,21 @@ where
let bounds = layout.bounds();
let state = tree.state.downcast_ref::<P::State>();
- renderer.draw_custom(
+ renderer.draw_pipeline_primitive(
bounds,
self.program.draw(state, cursor_position, bounds),
);
}
}
-impl<'a, M, P, Theme> From<Shader<M, P>>
- for Element<'a, M, crate::Renderer<Theme>>
+impl<'a, Message, Renderer, P> From<Shader<Message, P>>
+ for Element<'a, Message, Renderer>
where
- M: 'a,
- P: Program<M> + 'a,
+ Message: 'a,
+ Renderer: pipeline::Renderer,
+ P: Program<Message> + 'a,
{
- fn from(custom: Shader<M, P>) -> Element<'a, M, crate::Renderer<Theme>> {
+ fn from(custom: Shader<Message, P>) -> Element<'a, Message, Renderer> {
Element::new(custom)
}
}
@@ -193,16 +193,16 @@ where
state: &mut Self::State,
event: Event,
bounds: Rectangle,
- cursor: Cursor,
+ cursor: mouse::Cursor,
shell: &mut Shell<'_, Message>,
- ) -> (Status, Option<Message>) {
+ ) -> (event::Status, Option<Message>) {
T::update(self, state, event, bounds, cursor, shell)
}
fn draw(
&self,
state: &Self::State,
- cursor: Cursor,
+ cursor: mouse::Cursor,
bounds: Rectangle,
) -> Self::Primitive {
T::draw(self, state, cursor, bounds)
@@ -212,8 +212,8 @@ where
&self,
state: &Self::State,
bounds: Rectangle,
- cursor: Cursor,
- ) -> Interaction {
+ cursor: mouse::Cursor,
+ ) -> mouse::Interaction {
T::mouse_interaction(self, state, bounds, cursor)
}
}
diff --git a/renderer/src/widget/shader/event.rs b/widget/src/shader/event.rs
index 8901fb31..e4d2b03d 100644
--- a/renderer/src/widget/shader/event.rs
+++ b/widget/src/shader/event.rs
@@ -2,6 +2,7 @@
use crate::core::keyboard;
use crate::core::mouse;
use crate::core::touch;
+
use std::time::Instant;
pub use crate::core::event::Status;
diff --git a/renderer/src/widget/shader/program.rs b/widget/src/shader/program.rs
index b8871688..0319844d 100644
--- a/renderer/src/widget/shader/program.rs
+++ b/widget/src/shader/program.rs
@@ -1,6 +1,8 @@
-use crate::core::{event, mouse, Rectangle, Shell};
-use crate::widget;
-use widget::shader;
+use crate::core::event;
+use crate::core::mouse;
+use crate::core::{Rectangle, Shell};
+use crate::renderer::wgpu::primitive::pipeline;
+use crate::shader;
/// The state and logic of a [`Shader`] widget.
///
@@ -13,7 +15,7 @@ pub trait Program<Message> {
type State: Default + 'static;
/// The type of primitive this [`Program`] can draw.
- type Primitive: shader::Primitive + 'static;
+ type Primitive: pipeline::Primitive + 'static;
/// Update the internal [`State`] of the [`Program`]. This can be used to reflect state changes
/// based on mouse & other events. You can use the [`Shell`] to publish messages, request a