web client & more blending work

This commit is contained in:
core 2025-01-04 15:46:09 -05:00
parent fbe4b57bb4
commit c2a3ddb1ec
Signed by: core
GPG key ID: FDBF740DADDCEECF
9 changed files with 147 additions and 31 deletions

3
.gitignore vendored
View file

@ -1,4 +1,5 @@
*/target
target
node_modules
.cache
.cache
wxbox_client_wasm/dist

29
Cargo.lock generated
View file

@ -1051,6 +1051,16 @@ dependencies = [
"windows-sys 0.52.0",
]
[[package]]
name = "console_error_panic_hook"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc"
dependencies = [
"cfg-if",
"wasm-bindgen",
]
[[package]]
name = "convert_case"
version = "0.4.0"
@ -5050,6 +5060,17 @@ version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6"
[[package]]
name = "wasm-tracing"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2107431e9bd9fa9ff3c4e7d384563c849cbfae830866a74d59c3472942bd5af1"
dependencies = [
"tracing",
"tracing-subscriber",
"wasm-bindgen",
]
[[package]]
name = "wayland-backend"
version = "0.3.7"
@ -5769,6 +5790,14 @@ dependencies = [
[[package]]
name = "wxbox_client_wasm"
version = "0.1.0"
dependencies = [
"console_error_panic_hook",
"eframe",
"wasm-bindgen-futures",
"wasm-tracing",
"web-sys",
"wxbox_client",
]
[[package]]
name = "wxbox_common"

View file

@ -178,6 +178,30 @@ impl Sub for ColorF64 {
}
}
}
impl Sub<ColorF64> for f64 {
type Output = ColorF64;
fn sub(self, rhs: ColorF64) -> Self::Output {
ColorF64 {
red: rhs.red - self,
green: rhs.green - self,
blue: rhs.blue - self,
alpha: rhs.alpha - self
}
}
}
impl Mul<f64> for ColorF64 {
type Output = Self;
fn mul(self, rhs: f64) -> Self::Output {
Self {
red: self.red * rhs,
blue: self.blue * rhs,
green: self.green * rhs,
alpha: self.alpha * rhs
}
}
}
impl Mul for ColorF64 {
type Output = ColorF64;
@ -197,20 +221,15 @@ pub fn merge(base: Pixmap, data: Pixmap, settings: &TileRequestOptions) -> Pixma
for x in 0..256 {
for y in 0..256 {
let mut lower: ColorF64 = base.get(x, y).into();
lower.alpha = 1.0;
let mut upper: ColorF64 = data.get(x, y).into();
//upper.alpha = settings.data_transparency;
let mut c_b: ColorF64 = base.get(x, y).into();
let a_b = 1.0;
let mut c_s: ColorF64 = data.get(x, y).into();
let a_s = settings.data_transparency;
if upper.red == 0.0 && upper.green == 0.0 && upper.blue == 0.0 && upper.alpha == 0.0 {
lower.alpha = 1.0;
new.set(x, y, lower.into());
} else {
upper.alpha = 1.0;
new.set(x, y, upper.into());
}
let mut co = c_s * a_s + c_b * a_b * (1.0 - a_s);
co.alpha = 1.0;
// new.set(x, y, ((ColorF64 { red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0 } - ColorF64 { red: 2.0, green: 2.0, blue: 2.0, alpha: 2.0 } * upper) * (lower * lower) + ColorF64 { red: 2.0, green: 2.0, blue: 2.0, alpha: 2.0 } * lower * upper).into());
new.set(x, y, co.into());
}
}

View file

@ -25,7 +25,7 @@ impl TileSource for DynamicUrlSource {
fn tile_url(&self, tile_id: TileId) -> String {
format!(
"{}/{}/{}/{}.png?settings={}",
var("TILER_BASE_URL").unwrap(),
env!("TILER_BASE_URL"),
tile_id.zoom, tile_id.x, tile_id.y,
self.url_query
)
@ -54,7 +54,14 @@ impl WxboxApp {
data: "grib2/noaa_mrms_merged_composite_reflectivity_qc".to_string(),
data_transparency: 0.9,
}),
Default::default(),
HttpOptions {
cache: if cfg!(target_arch = "wasm32") {
None
} else {
Some(".cache".into())
},
user_agent: None,
},
ctx.clone()
),
map_memory: MapMemory::default()
@ -85,11 +92,16 @@ impl eframe::App for WxboxApp {
.collapsible(false)
.resizable(false)
.title_bar(false)
.anchor(Align2::LEFT_TOP, [10.0, 10.0])
.anchor(Align2::RIGHT_BOTTOM, [-10.0, -10.0])
.show(ui.ctx(), |ui| {
ui.horizontal(|ui| {
ui.hyperlink_to(attribution.text, attribution.url);
})
});
Window::new("wxbox")
.show(ui.ctx(), |ui| {
ui.label("Welcome to wxbox!")
})
});
}

View file

@ -4,3 +4,9 @@ version = "0.1.0"
edition = "2021"
[dependencies]
console_error_panic_hook = "0.1"
wasm-tracing = "1"
eframe = "0.30"
wxbox_client = { path = "../wxbox_client" }
wasm-bindgen-futures = "0.4"
web-sys = "0.3"

View file

@ -0,0 +1,33 @@
<!DOCTYPE html>
<html>
<head>
<title>wxbox</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" />
<style>
html, body {
overflow: hidden;
margin: 0;
padding: 0;
height: 100%;
width: 100%;
}
canvas {
margin-right: auto;
margin-left: auto;
display: block;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<canvas id="target"></canvas>
</body>
</html>

View file

@ -1,14 +0,0 @@
pub fn add(left: u64, right: u64) -> u64 {
left + right
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let result = add(2, 2);
assert_eq!(result, 4);
}
}

View file

@ -0,0 +1,30 @@
use wxbox_client::WxboxApp;
use web_sys::wasm_bindgen::JsCast;
fn main() {
console_error_panic_hook::set_once();
wasm_tracing::set_as_global_default();
let web_options = eframe::WebOptions::default();
wasm_bindgen_futures::spawn_local(async {
let document = web_sys::window()
.expect("no window?")
.document()
.expect("no document?");
let canvas = document
.get_element_by_id("target")
.expect("failed to find target canvas for rendering")
.dyn_into::<web_sys::HtmlCanvasElement>()
.expect("#target is not a canvas");
eframe::WebRunner::new()
.start(
canvas,
web_options,
Box::new(|cc| Ok(Box::new(WxboxApp::new(cc.egui_ctx.clone()))))
)
.await
.expect("failed to start eframe")
})
}

View file

@ -4,4 +4,4 @@ version = "0.1.0"
edition = "2021"
[dependencies]
serde = "1"
serde = { version = "1", features = ["derive"] }