diff --git a/galileo/Cargo.toml b/galileo/Cargo.toml index 249b8c8..4835356 100644 --- a/galileo/Cargo.toml +++ b/galileo/Cargo.toml @@ -13,6 +13,9 @@ exclude = [ "examples", ] +[lib] +crate-type = ["cdylib", "rlib"] + [features] default = ["wgpu", "tokio", "image", "serde"] web = ["wasm-bindgen-futures", "serde", "byte-conversion", "js-sys"] diff --git a/galileo/examples/data/points.rs b/galileo/examples/data/points.rs deleted file mode 100644 index 37f61c1..0000000 --- a/galileo/examples/data/points.rs +++ /dev/null @@ -1,110 +0,0 @@ -use galileo::control::event_processor::EventProcessor; -use galileo::control::map::MapController; -use galileo::layer::feature::{CirclePointSymbol, FeatureLayer}; -use galileo::primitives::Color; -use galileo::render::Renderer; -use galileo::winit::{WinitInputHandler, WinitMessenger}; -use galileo_types::cartesian::impls::point::Point2d; -use galileo_types::cartesian::size::Size; -use nalgebra::Point3; -use std::sync::{Arc, RwLock}; -use winit::event_loop::ControlFlow; -use winit::{ - event::{Event, WindowEvent}, - event_loop::EventLoop, - window::WindowBuilder, -}; -// todo: temporary moved out of examples until 3d points are figured out -fn generate_points() -> Vec>> { - let mut points = vec![]; - for x in -50..50 { - for y in -50..50 { - for z in 0..150 { - points.push(Point3::new( - x as f64 * 10000.0, - y as f64 * 10000.0, - z as f64 * 10000.0, - )) - } - } - } - vec![points] -} - -#[tokio::main] -async fn main() { - env_logger::init(); - - let event_loop = EventLoop::new().unwrap(); - let window = WindowBuilder::new().build(&event_loop).unwrap(); - let window = Arc::new(window); - - let messenger = WinitMessenger::new(window.clone()); - - let backend = galileo::render::wgpu::WgpuRenderer::create(&window).await; - let osm = galileo::layer::raster_tile::RasterTileLayer::from_url( - |index| { - format!( - "https://tile.openstreetmap.org/{}/{}/{}.png", - index.z, index.x, index.y - ) - }, - messenger.clone(), - ); - - let points = generate_points(); - let feature_layer = FeatureLayer::new( - points, - CirclePointSymbol { - size: 3.0, - color: Color::rgba(226, 184, 34, 255), - }, - ); - - let mut map = galileo::map::Map::new( - galileo::view::MapView::new_projected(&Point2d::new(0.0, 0.0), 156543.03392800014 / 4.0), - vec![Box::new(osm), Box::new(feature_layer)], - messenger.clone(), - ); - - let mut input_handler = WinitInputHandler::default(); - let controller = MapController::default(); - let mut event_processor = EventProcessor::default(); - event_processor.add_handler(controller); - - let backend = Arc::new(RwLock::new(backend)); - - event_loop - .run(move |event, target| { - target.set_control_flow(ControlFlow::Wait); - - match event { - Event::WindowEvent { event, window_id } if window_id == window.id() => { - match event { - WindowEvent::CloseRequested => { - target.exit(); - } - WindowEvent::Resized(size) => { - backend.write().unwrap().resize(size); - map.set_size(Size::new(size.width as f64, size.height as f64)); - } - WindowEvent::RedrawRequested => { - let cast: Arc> = backend.clone(); - map.load_layers(&cast); - backend.read().unwrap().render(&map).unwrap(); - } - other => { - if let Some(raw_event) = input_handler.process_user_input(&other) { - event_processor.handle(raw_event, &mut map); - } - } - } - } - Event::AboutToWait => { - map.animate(); - } - _ => (), - } - }) - .unwrap(); -} diff --git a/galileo/examples/georust.rs b/galileo/examples/georust.rs index 7d12656..bda7400 100644 --- a/galileo/examples/georust.rs +++ b/galileo/examples/georust.rs @@ -35,7 +35,7 @@ fn load_points() -> Vec> { pub async fn run(builder: MapBuilder) { let point_layer = FeatureLayer::new( load_points(), - ImagePointSymbol::from_file( + ImagePointSymbol::from_path( "galileo/examples/data/pin-yellow.png", Vector2::new(0.5, 1.0), 0.5, diff --git a/galileo/src/layer/feature_layer/symbol/point.rs b/galileo/src/layer/feature_layer/symbol/point.rs index f705685..443c2ba 100644 --- a/galileo/src/layer/feature_layer/symbol/point.rs +++ b/galileo/src/layer/feature_layer/symbol/point.rs @@ -53,7 +53,7 @@ pub struct ImagePointSymbol { } impl ImagePointSymbol { - pub fn from_file(path: &str, offset: Vector2, scale: f32) -> Result { + pub fn from_path(path: &str, offset: Vector2, scale: f32) -> Result { let image = image::io::Reader::open(path)?.decode()?; let dimensions = image.dimensions(); @@ -95,7 +95,7 @@ mod tests { #[test] fn image_symbol_from_file() { - let symbol = ImagePointSymbol::from_file( + let symbol = ImagePointSymbol::from_path( "examples/data/pin-yellow.png", Vector2::new(0.5, 1.0), 1.0, diff --git a/galileo/src/layer/vector_tile_layer/tile_provider/web_worker_provider.rs b/galileo/src/layer/vector_tile_layer/tile_provider/web_worker_provider.rs index 458c77a..7286526 100644 --- a/galileo/src/layer/vector_tile_layer/tile_provider/web_worker_provider.rs +++ b/galileo/src/layer/vector_tile_layer/tile_provider/web_worker_provider.rs @@ -257,7 +257,7 @@ fn store_vector_tile( let packed = renderer .read() .unwrap() - .pack_bundle(RenderBundle::Tessellating(bundle)); + .pack_bundle(&RenderBundle::Tessellating(bundle)); store.insert( index, TileState::Loaded(VectorTile { diff --git a/galileo/src/render/render_bundle/tessellating/serialization.rs b/galileo/src/render/render_bundle/tessellating/serialization.rs index f0d2c53..0429558 100644 --- a/galileo/src/render/render_bundle/tessellating/serialization.rs +++ b/galileo/src/render/render_bundle/tessellating/serialization.rs @@ -5,6 +5,7 @@ use crate::render::render_bundle::tessellating::{ use lyon::lyon_tessellation::VertexBuffers; use serde::{Deserialize, Serialize}; use std::mem::size_of; +use std::sync::Arc; #[derive(Debug, Deserialize, Serialize)] pub(crate) struct TessellatingRenderBundleBytes { @@ -13,13 +14,14 @@ pub(crate) struct TessellatingRenderBundleBytes { pub screen_ref: ScreenRefVertexBuffersBytes, pub images: Vec, pub primitives: Vec, + pub image_store: Vec<(u32, u32, Vec)>, pub clip_area: Option, + pub bundle_size: usize, } #[derive(Debug, Deserialize, Serialize)] pub(crate) struct ImageBytes { - image_bytes: Vec, - dimensions: (u32, u32), + image_index: usize, vertices: Vec, } @@ -87,14 +89,19 @@ impl TessellatingRenderBundle { images: self .images .into_iter() - .map(|(image, vertices)| ImageBytes { - image_bytes: bytemuck::cast_vec(image.bytes), - dimensions: image.dimensions, + .map(|(image_index, vertices)| ImageBytes { + image_index, vertices: bytemuck::cast_vec(vertices.to_vec()), }) .collect(), primitives: self.primitives, + image_store: self + .image_store + .into_iter() + .map(|image| (image.dimensions.0, image.dimensions.1, image.bytes.clone())) + .collect(), clip_area: self.clip_area.map(|v| v.into()), + bundle_size: self.buffer_size, }; converted @@ -108,20 +115,32 @@ impl TessellatingRenderBundle { images: bundle .images .into_iter() - .map(|v| { - let decoded_image = DecodedImage { - bytes: v.image_bytes, - dimensions: v.dimensions, - }; - let vertices = bytemuck::cast_vec(v.vertices) - .try_into() - .expect("invalid vector length"); - - (decoded_image, vertices) - }) + .map( + |ImageBytes { + image_index, + vertices, + }| { + let vertices = bytemuck::cast_vec(vertices) + .try_into() + .expect("invalid vector length"); + + (image_index, vertices) + }, + ) .collect(), primitives: bundle.primitives, + image_store: bundle + .image_store + .into_iter() + .map(|(width, height, bytes)| { + Arc::new(DecodedImage { + bytes, + dimensions: (width, height), + }) + }) + .collect(), clip_area: bundle.clip_area.map(|v| v.into_typed_unchecked()), + buffer_size: bundle.bundle_size, } } }