123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- use color::{palette::css::WHITE, parse_color};
- use color::{OpaqueColor, Srgb};
- use demo_renderer::{DemoMessage, DemoPaintSource};
- use dioxus::prelude::*;
- use dioxus_native::use_wgpu;
- use std::any::Any;
- use wgpu::{Features, Limits};
- mod demo_renderer;
- // CSS Styles
- static STYLES: Asset = asset!("./src/styles.css");
- // WGPU settings required by this example
- const FEATURES: Features = Features::PUSH_CONSTANTS;
- fn limits() -> Limits {
- Limits {
- max_push_constant_size: 16,
- ..Limits::default()
- }
- }
- type Color = OpaqueColor<Srgb>;
- fn main() {
- #[cfg(feature = "tracing")]
- tracing_subscriber::fmt::init();
- let config: Vec<Box<dyn Any>> = vec![Box::new(FEATURES), Box::new(limits())];
- dioxus_native::launch_cfg(app, Vec::new(), config);
- }
- fn app() -> Element {
- let mut show_cube = use_signal(|| true);
- let color_str = use_signal(|| String::from("red"));
- let color = use_memo(move || {
- parse_color(&color_str())
- .map(|c| c.to_alpha_color())
- .unwrap_or(WHITE)
- .split()
- .0
- });
- use_effect(move || println!("{:?}", color().components));
- rsx!(
- document::Link { rel: "stylesheet", href: STYLES }
- div { id:"overlay",
- h2 { "Control Panel" },
- button {
- onclick: move |_| show_cube.toggle(),
- if show_cube() {
- "Hide cube"
- } else {
- "Show cube"
- }
- }
- br {}
- ColorControl { label: "Color:", color_str },
- p { "This overlay demonstrates that the custom WGPU content can be rendered beneath layers of HTML content" }
- }
- div { id:"underlay",
- h2 { "Underlay" },
- p { "This underlay demonstrates that the custom WGPU content can be rendered above layers and blended with the content underneath" }
- }
- header {
- h1 { "Blitz WGPU Demo" }
- }
- if show_cube() {
- SpinningCube { color }
- }
- )
- }
- #[component]
- fn ColorControl(label: &'static str, color_str: Signal<String>) -> Element {
- rsx!(div {
- class: "color-control",
- { label },
- input {
- value: color_str(),
- oninput: move |evt| {
- *color_str.write() = evt.value()
- }
- }
- })
- }
- #[component]
- fn SpinningCube(color: Memo<Color>) -> Element {
- // Create custom paint source and register it with the renderer
- let paint_source = DemoPaintSource::new();
- let sender = paint_source.sender();
- let paint_source_id = use_wgpu(move || paint_source);
- use_effect(move || {
- sender.send(DemoMessage::SetColor(color())).unwrap();
- });
- rsx!(
- div { id:"canvas-container",
- canvas {
- id: "demo-canvas",
- "src": paint_source_id
- }
- }
- )
- }
|