From 259006ce56e7a3d09f202ac42b7dcb1fdfaa73c4 Mon Sep 17 00:00:00 2001 From: klangner Date: Sat, 12 Sep 2020 14:44:37 +0200 Subject: [PATCH 1/6] without bundle --- .gitignore | 3 +- demo/Cargo.toml | 23 ++++-- demo/config/display.ron | 4 - demo/config/input.ron | 27 ------ demo/index.html | 59 +++++++++++++ demo/src/lib.rs | 24 ++++++ demo/src/main.rs | 179 ---------------------------------------- demo/src/utils.rs | 12 +++ 8 files changed, 111 insertions(+), 220 deletions(-) delete mode 100644 demo/config/display.ron delete mode 100644 demo/config/input.ron create mode 100644 demo/index.html create mode 100644 demo/src/lib.rs delete mode 100644 demo/src/main.rs create mode 100644 demo/src/utils.rs diff --git a/.gitignore b/.gitignore index 49e95d5..f94e817 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /target /demo/target Cargo.lock -.vscode/ \ No newline at end of file +.vscode/ +pkg/ \ No newline at end of file diff --git a/demo/Cargo.toml b/demo/Cargo.toml index 68fd312..ee0b48d 100644 --- a/demo/Cargo.toml +++ b/demo/Cargo.toml @@ -4,13 +4,18 @@ version = "0.1.1" authors = ["Krzysztof Langner "] edition = "2018" -[dependencies] -rand = "0.7" -amethyst = {version = "0.15", features = ["tiles", "no-slow-safety-checks"]} -log = { version = "0.4.8", features = ["serde"] } -mapgen = {path=".."} +[lib] +crate-type = ["cdylib"] -[features] -default = ["metal"] -metal = ["amethyst/metal"] -vulkan = ["amethyst/vulkan"] +[dependencies] +wasm-bindgen = "0.2.68" + +[dependencies.web-sys] +version = "0.3.4" +features = [ + 'Document', + 'Element', + 'HtmlElement', + 'Node', + 'Window', +] \ No newline at end of file diff --git a/demo/config/display.ron b/demo/config/display.ron deleted file mode 100644 index c5a98fd..0000000 --- a/demo/config/display.ron +++ /dev/null @@ -1,4 +0,0 @@ -( - title: "mapgen demo", - dimensions: Some((840, 520)), -) \ No newline at end of file diff --git a/demo/config/input.ron b/demo/config/input.ron deleted file mode 100644 index cb5dae1..0000000 --- a/demo/config/input.ron +++ /dev/null @@ -1,27 +0,0 @@ - -( - axes: { - "camera_x": Emulated( - pos: Key(D), - neg: Key(A), - ), - "camera_y": Emulated( - pos: Key(W), - neg: Key(S), - ), - "camera_scale": Emulated( - pos: Key(E), - neg: Key(Q), - ), - "camera_z": Emulated( - pos: Key(R), - neg: Key(F), - ), - }, - actions: { - "camera_switch": [[Key(Space)]], - "select": [[Mouse(Left)]], - "toggle_rotation": [[Key(Y)]], - "toggle_translation": [[Key(T)]], - }, -) \ No newline at end of file diff --git a/demo/index.html b/demo/index.html new file mode 100644 index 0000000..02f635b --- /dev/null +++ b/demo/index.html @@ -0,0 +1,59 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/demo/src/lib.rs b/demo/src/lib.rs new file mode 100644 index 0000000..1e83b62 --- /dev/null +++ b/demo/src/lib.rs @@ -0,0 +1,24 @@ +use wasm_bindgen::prelude::*; + +// Called when the wasm module is instantiated +#[wasm_bindgen(start)] +pub fn main() -> Result<(), JsValue> { + // Use `web_sys`'s global `window` function to get a handle on the global + // window object. + let window = web_sys::window().expect("no global `window` exists"); + let document = window.document().expect("should have a document on window"); + let body = document.body().expect("document should have a body"); + + // Manufacture the element we're gonna append + let val = document.create_element("p")?; + val.set_inner_html("Hello from Rust!"); + + body.append_child(&val)?; + + Ok(()) +} + +#[wasm_bindgen] +pub fn add(a: u32, b: u32) -> u32 { + a + b +} \ No newline at end of file diff --git a/demo/src/main.rs b/demo/src/main.rs deleted file mode 100644 index 436b976..0000000 --- a/demo/src/main.rs +++ /dev/null @@ -1,179 +0,0 @@ -use amethyst::{ - assets::{AssetStorage, Loader}, - core::{ - math::{Point3, Vector3}, - Transform, TransformBundle, - }, - ecs::Entity, - input::{is_close_requested, is_key_down, InputBundle, StringBindings}, - prelude::*, - renderer::{ - camera::Camera, - formats::texture::ImageFormat, - sprite::{SpriteSheet, SpriteSheetFormat, SpriteSheetHandle}, - types::DefaultBackend, - RenderFlat2D, RenderToWindow, RenderingBundle, Texture, - palette::Srgba, - }, - tiles::{MortonEncoder, RenderTiles2D, Tile, TileMap}, - utils::application_root_dir, - window::ScreenDimensions, - winit, -}; -use mapgen::dungeon::{ - MapBuilder, - map::{Map, Point, TileType}, - cellular_automata::CellularAutomataGen, - starting_point::{AreaStartingPosition, XStart, YStart}, - cull_unreachable::CullUnreachable, - distant_exit::DistantExit, -}; - - -#[derive(Default, Clone)] -struct MapTiles ; - -impl Tile for MapTiles { - fn sprite(&self, p: Point3, world: &World) -> Option { - let map = world.read_resource::(); - let pos = Point::new(p.x as usize, p.y as usize); - if map.starting_point == Some(pos) { - Some(160) - } else if map.exit_point == Some(pos) { - Some(12) - } else if map.at(p.x as usize, p.y as usize) == TileType::Wall { - Some(140) - } else { - Some(19) - } - } - - fn tint(&self, p: Point3, world: &World) -> Srgba { - let map = world.read_resource::(); - let pos = Some(Point::new(p.x as usize, p.y as usize)); - if map.starting_point == pos || map.exit_point == pos { - Srgba::new(1.0, 1.0, 0.0, 1.0) - } else { - Srgba::new(1.0, 1.0, 1.0, 1.0) - } - } -} - -fn load_tiles_sprite_sheet(world: &mut World, png_path: &str, ron_path: &str) -> SpriteSheetHandle { - let texture_handle = { - let loader = world.read_resource::(); - let texture_storage = world.read_resource::>(); - loader.load(png_path, ImageFormat::default(), (), &texture_storage) - }; - let loader = world.read_resource::(); - let sprite_sheet_store = world.read_resource::>(); - loader.load( - ron_path, - SpriteSheetFormat(texture_handle), - (), - &sprite_sheet_store, - ) -} - -fn init_camera(world: &mut World, transform: Transform, camera: Camera) -> Entity { - world - .create_entity() - .with(transform) - .with(camera) - .named("camera") - .build() -} - -fn init_map(world: &mut World) { - let map = MapBuilder::new(Box::new(CellularAutomataGen::new(80, 50))) - .with(AreaStartingPosition::new(XStart::CENTER, YStart::CENTER)) - .with(CullUnreachable::new()) - .with(DistantExit::new()) - .build_map(); - world.insert(map); -} - - -struct PlayState; -impl SimpleState for PlayState { - fn on_start(&mut self, data: StateData<'_, GameData<'_, '_>>) { - - let mut world = data.world; - - // Create map - init_map(&mut world); - - let map_sprite_sheet_handle = - load_tiles_sprite_sheet(world, "texture/basic.png", "texture/basic.ron"); - - let (width, height) = { - let dim = world.read_resource::(); - (dim.width(), dim.height()) - }; - - let _camera = init_camera( - world, - Transform::from(Vector3::new(-10.0, 10.0, 1.1)), - Camera::standard_2d(width, height), - ); - - let tile_map = TileMap::::new( - Vector3::new(80, 50, 1), - Vector3::new(20, 20, 1), - Some(map_sprite_sheet_handle), - ); - - let _map_entity = world - .create_entity() - .with(tile_map) - .with(Transform::default()) - .build(); - } - - fn handle_event( - &mut self, - data: StateData<'_, GameData<'_, '_>>, - event: StateEvent, - ) -> SimpleTrans { - let StateData { .. } = data; - if let StateEvent::Window(event) = &event { - if is_close_requested(&event) || is_key_down(&event, winit::VirtualKeyCode::Escape) { - Trans::Quit - } else { - Trans::None - } - } else { - Trans::None - } - } -} - -fn main() -> amethyst::Result<()> { - amethyst::Logger::from_config(Default::default()) - .level_for("demo", log::LevelFilter::Warn) - .start(); - - let app_root = application_root_dir()?; - let assets_directory = app_root.join("assets"); - let display_config_path = app_root.join("config/display.ron"); - - let game_data = GameDataBuilder::default() - .with_bundle(TransformBundle::new())? - .with_bundle( - InputBundle::::new() - .with_bindings_from_file("config/input.ron")?, - )? - .with_bundle( - RenderingBundle::::new() - .with_plugin( - RenderToWindow::from_config_path(display_config_path)? - .with_clear([0.0, 0.0, 0.0, 1.0]), - ) - .with_plugin(RenderFlat2D::default()) - .with_plugin(RenderTiles2D::::default()), - )?; - - let mut game = Application::build(assets_directory, PlayState)?.build(game_data)?; - game.run(); - Ok(()) -} \ No newline at end of file diff --git a/demo/src/utils.rs b/demo/src/utils.rs new file mode 100644 index 0000000..971a4bc --- /dev/null +++ b/demo/src/utils.rs @@ -0,0 +1,12 @@ + +pub fn set_panic_hook() { + // When the `console_error_panic_hook` feature is enabled, we can call the + // `set_panic_hook` function at least once during initialization, and then + // we will get better error messages if our code ever panics. + // + // For more details see + // https://github.com/rustwasm/console_error_panic_hook#readme + #[cfg(feature = "console_error_panic_hook")] + console_error_panic_hook::set_once(); +} + From dbf765dff45fc46b3885f32ca51fc6cdc9749ab0 Mon Sep 17 00:00:00 2001 From: klangner Date: Sat, 12 Sep 2020 15:10:35 +0200 Subject: [PATCH 2/6] working webpack --- demo/README.md | 4 ++++ demo/src/lib.rs | 2 +- demo/www | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) create mode 160000 demo/www diff --git a/demo/README.md b/demo/README.md index ad7baa8..4f2b82a 100644 --- a/demo/README.md +++ b/demo/README.md @@ -1,6 +1,10 @@ # Demo application for mapgen +## Build the project: +``` +wasm-pack build +``` This app uses: * [Urizen OneBit Tilesets](https://vurmux.itch.io/urizen-onebit-tilesets) \ No newline at end of file diff --git a/demo/src/lib.rs b/demo/src/lib.rs index 1e83b62..639b37e 100644 --- a/demo/src/lib.rs +++ b/demo/src/lib.rs @@ -11,7 +11,7 @@ pub fn main() -> Result<(), JsValue> { // Manufacture the element we're gonna append let val = document.create_element("p")?; - val.set_inner_html("Hello from Rust!"); + val.set_inner_html("Hello from Rust! 1"); body.append_child(&val)?; diff --git a/demo/www b/demo/www new file mode 160000 index 0000000..9ac3dff --- /dev/null +++ b/demo/www @@ -0,0 +1 @@ +Subproject commit 9ac3dff9ebea4675e5c478bcdcbc0fd547d1529f From a0b32a783b657e5d03501061763d64db357dad06 Mon Sep 17 00:00:00 2001 From: klangner Date: Sat, 12 Sep 2020 15:49:33 +0200 Subject: [PATCH 3/6] First working version --- .gitignore | 3 +- demo/README.md | 2 + docs/0.bootstrap.js | 72 ++++++ docs/bootstrap.js | 315 ++++++++++++++++++++++++++ docs/f138b06b088ae74c6a29.module.wasm | Bin 0 -> 17489 bytes docs/index.html | 26 +-- docs/index.js | 199 ---------------- 7 files changed, 394 insertions(+), 223 deletions(-) create mode 100644 docs/0.bootstrap.js create mode 100644 docs/bootstrap.js create mode 100644 docs/f138b06b088ae74c6a29.module.wasm delete mode 100644 docs/index.js diff --git a/.gitignore b/.gitignore index f94e817..39266be 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ /demo/target Cargo.lock .vscode/ -pkg/ \ No newline at end of file +pkg/ +package-lock.json \ No newline at end of file diff --git a/demo/README.md b/demo/README.md index 4f2b82a..d9669b8 100644 --- a/demo/README.md +++ b/demo/README.md @@ -4,6 +4,8 @@ ``` wasm-pack build +cd www +npm run build ``` This app uses: diff --git a/docs/0.bootstrap.js b/docs/0.bootstrap.js new file mode 100644 index 0000000..af1b577 --- /dev/null +++ b/docs/0.bootstrap.js @@ -0,0 +1,72 @@ +(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[0],{ + +/***/ "../pkg/mapgen_demo.js": +/*!*****************************!*\ + !*** ../pkg/mapgen_demo.js ***! + \*****************************/ +/*! exports provided: main, add, __wbindgen_object_drop_ref, __wbg_instanceof_Window_adf3196bdc02b386, __wbg_document_6cc8d0b87c0a99b9, __wbg_body_8c888fe47d81765f, __wbg_createElement_5bdf88a5af9f17c5, __wbg_setinnerHTML_4ff235db1a3cb4d8, __wbg_appendChild_77215fd672b162c5, __wbg_call_8e95613cc6524977, __wbindgen_object_clone_ref, __wbg_newnoargs_f3b8a801d5d4b079, __wbg_self_07b2f89e82ceb76d, __wbg_window_ba85d88572adc0dc, __wbg_globalThis_b9277fc37e201fe5, __wbg_global_e16303fe83e1d57f, __wbindgen_is_undefined, __wbindgen_throw, __wbindgen_rethrow */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mapgen_demo_bg.wasm */ \"../pkg/mapgen_demo_bg.wasm\");\n/* harmony import */ var _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mapgen_demo_bg.js */ \"../pkg/mapgen_demo_bg.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"main\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"main\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"add\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"add\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_object_drop_ref\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_instanceof_Window_adf3196bdc02b386\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_instanceof_Window_adf3196bdc02b386\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_document_6cc8d0b87c0a99b9\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_document_6cc8d0b87c0a99b9\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_body_8c888fe47d81765f\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_body_8c888fe47d81765f\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_createElement_5bdf88a5af9f17c5\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_createElement_5bdf88a5af9f17c5\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_setinnerHTML_4ff235db1a3cb4d8\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_setinnerHTML_4ff235db1a3cb4d8\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_appendChild_77215fd672b162c5\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_appendChild_77215fd672b162c5\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_call_8e95613cc6524977\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_call_8e95613cc6524977\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_clone_ref\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_object_clone_ref\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_newnoargs_f3b8a801d5d4b079\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_newnoargs_f3b8a801d5d4b079\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_self_07b2f89e82ceb76d\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_self_07b2f89e82ceb76d\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_window_ba85d88572adc0dc\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_window_ba85d88572adc0dc\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_globalThis_b9277fc37e201fe5\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_globalThis_b9277fc37e201fe5\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_global_e16303fe83e1d57f\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_global_e16303fe83e1d57f\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_undefined\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_is_undefined\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_throw\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_rethrow\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_rethrow\"]; });\n\n\n\n_mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_start\"]();\n\n\n//# sourceURL=webpack:///../pkg/mapgen_demo.js?"); + +/***/ }), + +/***/ "../pkg/mapgen_demo_bg.js": +/*!********************************!*\ + !*** ../pkg/mapgen_demo_bg.js ***! + \********************************/ +/*! exports provided: main, add, __wbindgen_object_drop_ref, __wbg_instanceof_Window_adf3196bdc02b386, __wbg_document_6cc8d0b87c0a99b9, __wbg_body_8c888fe47d81765f, __wbg_createElement_5bdf88a5af9f17c5, __wbg_setinnerHTML_4ff235db1a3cb4d8, __wbg_appendChild_77215fd672b162c5, __wbg_call_8e95613cc6524977, __wbindgen_object_clone_ref, __wbg_newnoargs_f3b8a801d5d4b079, __wbg_self_07b2f89e82ceb76d, __wbg_window_ba85d88572adc0dc, __wbg_globalThis_b9277fc37e201fe5, __wbg_global_e16303fe83e1d57f, __wbindgen_is_undefined, __wbindgen_throw, __wbindgen_rethrow */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(module, global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"main\", function() { return main; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"add\", function() { return add; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return __wbindgen_object_drop_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_instanceof_Window_adf3196bdc02b386\", function() { return __wbg_instanceof_Window_adf3196bdc02b386; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_document_6cc8d0b87c0a99b9\", function() { return __wbg_document_6cc8d0b87c0a99b9; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_body_8c888fe47d81765f\", function() { return __wbg_body_8c888fe47d81765f; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_createElement_5bdf88a5af9f17c5\", function() { return __wbg_createElement_5bdf88a5af9f17c5; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_setinnerHTML_4ff235db1a3cb4d8\", function() { return __wbg_setinnerHTML_4ff235db1a3cb4d8; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_appendChild_77215fd672b162c5\", function() { return __wbg_appendChild_77215fd672b162c5; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_call_8e95613cc6524977\", function() { return __wbg_call_8e95613cc6524977; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_clone_ref\", function() { return __wbindgen_object_clone_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_newnoargs_f3b8a801d5d4b079\", function() { return __wbg_newnoargs_f3b8a801d5d4b079; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_self_07b2f89e82ceb76d\", function() { return __wbg_self_07b2f89e82ceb76d; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_window_ba85d88572adc0dc\", function() { return __wbg_window_ba85d88572adc0dc; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_globalThis_b9277fc37e201fe5\", function() { return __wbg_globalThis_b9277fc37e201fe5; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_global_e16303fe83e1d57f\", function() { return __wbg_global_e16303fe83e1d57f; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_undefined\", function() { return __wbindgen_is_undefined; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return __wbindgen_throw; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_rethrow\", function() { return __wbindgen_rethrow; });\n/* harmony import */ var _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mapgen_demo_bg.wasm */ \"../pkg/mapgen_demo_bg.wasm\");\n\n\nconst heap = new Array(32).fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nfunction getObject(idx) { return heap[idx]; }\n\nlet heap_next = heap.length;\n\nfunction dropObject(idx) {\n if (idx < 36) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n\nfunction addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n}\n\nconst lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder;\n\nlet cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n\ncachedTextDecoder.decode();\n\nlet cachegetUint8Memory0 = null;\nfunction getUint8Memory0() {\n if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetUint8Memory0 = new Uint8Array(_mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetUint8Memory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));\n}\n/**\n*/\nfunction main() {\n _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"main\"]();\n}\n\n/**\n* @param {number} a\n* @param {number} b\n* @returns {number}\n*/\nfunction add(a, b) {\n var ret = _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"add\"](a, b);\n return ret >>> 0;\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nfunction handleError(f) {\n return function () {\n try {\n return f.apply(this, arguments);\n\n } catch (e) {\n _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_exn_store\"](addHeapObject(e));\n }\n };\n}\n\nconst __wbindgen_object_drop_ref = function(arg0) {\n takeObject(arg0);\n};\n\nconst __wbg_instanceof_Window_adf3196bdc02b386 = function(arg0) {\n var ret = getObject(arg0) instanceof Window;\n return ret;\n};\n\nconst __wbg_document_6cc8d0b87c0a99b9 = function(arg0) {\n var ret = getObject(arg0).document;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n};\n\nconst __wbg_body_8c888fe47d81765f = function(arg0) {\n var ret = getObject(arg0).body;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n};\n\nconst __wbg_createElement_5bdf88a5af9f17c5 = handleError(function(arg0, arg1, arg2) {\n var ret = getObject(arg0).createElement(getStringFromWasm0(arg1, arg2));\n return addHeapObject(ret);\n});\n\nconst __wbg_setinnerHTML_4ff235db1a3cb4d8 = function(arg0, arg1, arg2) {\n getObject(arg0).innerHTML = getStringFromWasm0(arg1, arg2);\n};\n\nconst __wbg_appendChild_77215fd672b162c5 = handleError(function(arg0, arg1) {\n var ret = getObject(arg0).appendChild(getObject(arg1));\n return addHeapObject(ret);\n});\n\nconst __wbg_call_8e95613cc6524977 = handleError(function(arg0, arg1) {\n var ret = getObject(arg0).call(getObject(arg1));\n return addHeapObject(ret);\n});\n\nconst __wbindgen_object_clone_ref = function(arg0) {\n var ret = getObject(arg0);\n return addHeapObject(ret);\n};\n\nconst __wbg_newnoargs_f3b8a801d5d4b079 = function(arg0, arg1) {\n var ret = new Function(getStringFromWasm0(arg0, arg1));\n return addHeapObject(ret);\n};\n\nconst __wbg_self_07b2f89e82ceb76d = handleError(function() {\n var ret = self.self;\n return addHeapObject(ret);\n});\n\nconst __wbg_window_ba85d88572adc0dc = handleError(function() {\n var ret = window.window;\n return addHeapObject(ret);\n});\n\nconst __wbg_globalThis_b9277fc37e201fe5 = handleError(function() {\n var ret = globalThis.globalThis;\n return addHeapObject(ret);\n});\n\nconst __wbg_global_e16303fe83e1d57f = handleError(function() {\n var ret = global.global;\n return addHeapObject(ret);\n});\n\nconst __wbindgen_is_undefined = function(arg0) {\n var ret = getObject(arg0) === undefined;\n return ret;\n};\n\nconst __wbindgen_throw = function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n};\n\nconst __wbindgen_rethrow = function(arg0) {\n throw takeObject(arg0);\n};\n\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../www/node_modules/webpack/buildin/harmony-module.js */ \"./node_modules/webpack/buildin/harmony-module.js\")(module), __webpack_require__(/*! ./../www/node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack:///../pkg/mapgen_demo_bg.js?"); + +/***/ }), + +/***/ "../pkg/mapgen_demo_bg.wasm": +/*!**********************************!*\ + !*** ../pkg/mapgen_demo_bg.wasm ***! + \**********************************/ +/*! exports provided: memory, main, add, __wbindgen_exn_store, __wbindgen_start */ +/***/ (function(module, exports, __webpack_require__) { + +eval("\"use strict\";\n// Instantiate WebAssembly module\nvar wasmExports = __webpack_require__.w[module.i];\n__webpack_require__.r(exports);\n// export exports from WebAssembly module\nfor(var name in wasmExports) if(name != \"__webpack_init__\") exports[name] = wasmExports[name];\n// exec imports from WebAssembly module (for esm order)\n/* harmony import */ var m0 = __webpack_require__(/*! ./mapgen_demo_bg.js */ \"../pkg/mapgen_demo_bg.js\");\n\n\n// exec wasm module\nwasmExports[\"__webpack_init__\"]()\n\n//# sourceURL=webpack:///../pkg/mapgen_demo_bg.wasm?"); + +/***/ }), + +/***/ "./index.js": +/*!******************!*\ + !*** ./index.js ***! + \******************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var mapgen_demo__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mapgen-demo */ \"../pkg/mapgen_demo.js\");\n\n\nconst x = mapgen_demo__WEBPACK_IMPORTED_MODULE_0__[\"add\"](1, 4);\nconsole.log(x);\n\n\n//# sourceURL=webpack:///./index.js?"); + +/***/ }), + +/***/ "./node_modules/webpack/buildin/global.js": +/*!***********************************!*\ + !*** (webpack)/buildin/global.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n//# sourceURL=webpack:///(webpack)/buildin/global.js?"); + +/***/ }), + +/***/ "./node_modules/webpack/buildin/harmony-module.js": +/*!*******************************************!*\ + !*** (webpack)/buildin/harmony-module.js ***! + \*******************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("module.exports = function(originalModule) {\n\tif (!originalModule.webpackPolyfill) {\n\t\tvar module = Object.create(originalModule);\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"exports\", {\n\t\t\tenumerable: true\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n\n\n//# sourceURL=webpack:///(webpack)/buildin/harmony-module.js?"); + +/***/ }) + +}]); \ No newline at end of file diff --git a/docs/bootstrap.js b/docs/bootstrap.js new file mode 100644 index 0000000..98abbdc --- /dev/null +++ b/docs/bootstrap.js @@ -0,0 +1,315 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // install a JSONP callback for chunk loading +/******/ function webpackJsonpCallback(data) { +/******/ var chunkIds = data[0]; +/******/ var moreModules = data[1]; +/******/ +/******/ +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0, resolves = []; +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ resolves.push(installedChunks[chunkId][0]); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ for(moduleId in moreModules) { +/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { +/******/ modules[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(parentJsonpFunction) parentJsonpFunction(data); +/******/ +/******/ while(resolves.length) { +/******/ resolves.shift()(); +/******/ } +/******/ +/******/ }; +/******/ +/******/ +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // Promise = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "main": 0 +/******/ }; +/******/ +/******/ +/******/ +/******/ // script path function +/******/ function jsonpScriptSrc(chunkId) { +/******/ return __webpack_require__.p + "" + chunkId + ".bootstrap.js" +/******/ } +/******/ +/******/ // object to store loaded and loading wasm modules +/******/ var installedWasmModules = {}; +/******/ +/******/ function promiseResolve() { return Promise.resolve(); } +/******/ +/******/ var wasmImportObjects = { +/******/ "../pkg/mapgen_demo_bg.wasm": function() { +/******/ return { +/******/ "./mapgen_demo_bg.js": { +/******/ "__wbindgen_object_drop_ref": function(p0i32) { +/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbindgen_object_drop_ref"](p0i32); +/******/ }, +/******/ "__wbg_instanceof_Window_adf3196bdc02b386": function(p0i32) { +/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_instanceof_Window_adf3196bdc02b386"](p0i32); +/******/ }, +/******/ "__wbg_document_6cc8d0b87c0a99b9": function(p0i32) { +/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_document_6cc8d0b87c0a99b9"](p0i32); +/******/ }, +/******/ "__wbg_body_8c888fe47d81765f": function(p0i32) { +/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_body_8c888fe47d81765f"](p0i32); +/******/ }, +/******/ "__wbg_createElement_5bdf88a5af9f17c5": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_createElement_5bdf88a5af9f17c5"](p0i32,p1i32,p2i32); +/******/ }, +/******/ "__wbg_setinnerHTML_4ff235db1a3cb4d8": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_setinnerHTML_4ff235db1a3cb4d8"](p0i32,p1i32,p2i32); +/******/ }, +/******/ "__wbg_appendChild_77215fd672b162c5": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_appendChild_77215fd672b162c5"](p0i32,p1i32); +/******/ }, +/******/ "__wbg_call_8e95613cc6524977": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_call_8e95613cc6524977"](p0i32,p1i32); +/******/ }, +/******/ "__wbindgen_object_clone_ref": function(p0i32) { +/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbindgen_object_clone_ref"](p0i32); +/******/ }, +/******/ "__wbg_newnoargs_f3b8a801d5d4b079": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_newnoargs_f3b8a801d5d4b079"](p0i32,p1i32); +/******/ }, +/******/ "__wbg_self_07b2f89e82ceb76d": function() { +/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_self_07b2f89e82ceb76d"](); +/******/ }, +/******/ "__wbg_window_ba85d88572adc0dc": function() { +/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_window_ba85d88572adc0dc"](); +/******/ }, +/******/ "__wbg_globalThis_b9277fc37e201fe5": function() { +/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_globalThis_b9277fc37e201fe5"](); +/******/ }, +/******/ "__wbg_global_e16303fe83e1d57f": function() { +/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_global_e16303fe83e1d57f"](); +/******/ }, +/******/ "__wbindgen_is_undefined": function(p0i32) { +/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbindgen_is_undefined"](p0i32); +/******/ }, +/******/ "__wbindgen_throw": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbindgen_throw"](p0i32,p1i32); +/******/ }, +/******/ "__wbindgen_rethrow": function(p0i32) { +/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbindgen_rethrow"](p0i32); +/******/ } +/******/ } +/******/ }; +/******/ }, +/******/ }; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = function requireEnsure(chunkId) { +/******/ var promises = []; +/******/ +/******/ +/******/ // JSONP chunk loading for javascript +/******/ +/******/ var installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise(function(resolve, reject) { +/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; +/******/ }); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var script = document.createElement('script'); +/******/ var onScriptComplete; +/******/ +/******/ script.charset = 'utf-8'; +/******/ script.timeout = 120; +/******/ if (__webpack_require__.nc) { +/******/ script.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ script.src = jsonpScriptSrc(chunkId); +/******/ +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ onScriptComplete = function (event) { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var chunk = installedChunks[chunkId]; +/******/ if(chunk !== 0) { +/******/ if(chunk) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ chunk[1](error); +/******/ } +/******/ installedChunks[chunkId] = undefined; +/******/ } +/******/ }; +/******/ var timeout = setTimeout(function(){ +/******/ onScriptComplete({ type: 'timeout', target: script }); +/******/ }, 120000); +/******/ script.onerror = script.onload = onScriptComplete; +/******/ document.head.appendChild(script); +/******/ } +/******/ } +/******/ +/******/ // Fetch + compile chunk loading for webassembly +/******/ +/******/ var wasmModules = {"0":["../pkg/mapgen_demo_bg.wasm"]}[chunkId] || []; +/******/ +/******/ wasmModules.forEach(function(wasmModuleId) { +/******/ var installedWasmModuleData = installedWasmModules[wasmModuleId]; +/******/ +/******/ // a Promise means "currently loading" or "already loaded". +/******/ if(installedWasmModuleData) +/******/ promises.push(installedWasmModuleData); +/******/ else { +/******/ var importObject = wasmImportObjects[wasmModuleId](); +/******/ var req = fetch(__webpack_require__.p + "" + {"../pkg/mapgen_demo_bg.wasm":"f138b06b088ae74c6a29"}[wasmModuleId] + ".module.wasm"); +/******/ var promise; +/******/ if(importObject instanceof Promise && typeof WebAssembly.compileStreaming === 'function') { +/******/ promise = Promise.all([WebAssembly.compileStreaming(req), importObject]).then(function(items) { +/******/ return WebAssembly.instantiate(items[0], items[1]); +/******/ }); +/******/ } else if(typeof WebAssembly.instantiateStreaming === 'function') { +/******/ promise = WebAssembly.instantiateStreaming(req, importObject); +/******/ } else { +/******/ var bytesPromise = req.then(function(x) { return x.arrayBuffer(); }); +/******/ promise = bytesPromise.then(function(bytes) { +/******/ return WebAssembly.instantiate(bytes, importObject); +/******/ }); +/******/ } +/******/ promises.push(installedWasmModules[wasmModuleId] = promise.then(function(res) { +/******/ return __webpack_require__.w[wasmModuleId] = (res.instance || res).exports; +/******/ })); +/******/ } +/******/ }); +/******/ return Promise.all(promises); +/******/ }; +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // on error function for async loading +/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; +/******/ +/******/ // object with all WebAssembly.instance exports +/******/ __webpack_require__.w = {}; +/******/ +/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; +/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); +/******/ jsonpArray.push = webpackJsonpCallback; +/******/ jsonpArray = jsonpArray.slice(); +/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); +/******/ var parentJsonpFunction = oldJsonpFunction; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./bootstrap.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./bootstrap.js": +/*!**********************!*\ + !*** ./bootstrap.js ***! + \**********************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// A dependency graph that contains any wasm must all be imported\n// asynchronously. This `bootstrap.js` file does the single async import, so\n// that no one else needs to worry about it again.\n__webpack_require__.e(/*! import() */ 0).then(__webpack_require__.bind(null, /*! ./index.js */ \"./index.js\"))\n .catch(e => console.error(\"Error importing `index.js`:\", e));\n\n\n//# sourceURL=webpack:///./bootstrap.js?"); + +/***/ }) + +/******/ }); \ No newline at end of file diff --git a/docs/f138b06b088ae74c6a29.module.wasm b/docs/f138b06b088ae74c6a29.module.wasm new file mode 100644 index 0000000000000000000000000000000000000000..df8bd3e92f6b98d43e7d62481625f9d7192f9bfe GIT binary patch literal 17489 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 literal 0 HcmV?d00001 diff --git a/docs/index.html b/docs/index.html index 4d44e59..ca5615c 100644 --- a/docs/index.html +++ b/docs/index.html @@ -2,30 +2,10 @@ - Mapgen demo - + Hello wasm-pack! -

Map generator demo

- -
- - + + diff --git a/docs/index.js b/docs/index.js deleted file mode 100644 index fb41e3f..0000000 --- a/docs/index.js +++ /dev/null @@ -1,199 +0,0 @@ -import { Universe, Cell } from "wasm-game-of-life"; -import { memory } from "wasm-game-of-life/wasm_game_of_life_bg"; - -const CELL_SIZE = 8; // px -const GRID_COLOR = "#CCCCCC"; -const DEAD_COLOR = "#FFFFFF"; -const ALIVE_COLOR = "#000000"; - -// Construct the universe, and get its width and height. -// const universe = Universe.new_spaceship(); -const universe = Universe.new(); -const width = universe.width(); -const height = universe.height(); - -// Give the canvas room for all of our cells and a 1px border -// around each of them. -const canvas = document.getElementById("game-of-life-canvas"); -canvas.height = (CELL_SIZE + 1) * height + 1; -canvas.width = (CELL_SIZE + 1) * width + 1; - -const ctx = canvas.getContext('2d'); - -let animationId = null; - -const renderLoop = () => { - fps.render(); - for (let i = 0; i < 9; i++) { - universe.tick(); - } - - drawGrid(); - drawCells(); - - animationId = requestAnimationFrame(renderLoop); -}; - -const drawGrid = () => { - ctx.beginPath(); - ctx.strokeStyle = GRID_COLOR; - - // Vertical lines. - for (let i = 0; i <= width; i++) { - ctx.moveTo(i * (CELL_SIZE + 1) + 1, 0); - ctx.lineTo(i * (CELL_SIZE + 1) + 1, (CELL_SIZE + 1) * height + 1); - } - - // Horizontal lines. - for (let j = 0; j <= height; j++) { - ctx.moveTo(0, j * (CELL_SIZE + 1) + 1); - ctx.lineTo((CELL_SIZE + 1) * width + 1, j * (CELL_SIZE + 1) + 1); - } - - ctx.stroke(); -}; - -const getIndex = (row, column) => { - return row * width + column; -}; - -const drawCells = () => { - const cellsPtr = universe.cells(); - - // This is updated! - const cells = new Uint8Array(memory.buffer, cellsPtr, width * height / 8); - - ctx.beginPath(); - - // Alive cells. - ctx.fillStyle = ALIVE_COLOR; - for (let row = 0; row < height; row++) { - for (let col = 0; col < width; col++) { - const idx = getIndex(row, col); - if (!bitIsSet(idx, cells)) { - continue; - } - - ctx.fillRect( - col * (CELL_SIZE + 1) + 1, - row * (CELL_SIZE + 1) + 1, - CELL_SIZE, - CELL_SIZE - ); - } - } - - // Dead cells. - ctx.fillStyle = DEAD_COLOR; - for (let row = 0; row < height; row++) { - for (let col = 0; col < width; col++) { - const idx = getIndex(row, col); - if (bitIsSet(idx, cells)) { - continue; - } - - ctx.fillRect( - col * (CELL_SIZE + 1) + 1, - row * (CELL_SIZE + 1) + 1, - CELL_SIZE, - CELL_SIZE - ); - } - } - - ctx.stroke(); -}; - -const bitIsSet = (n, arr) => { - const byte = Math.floor(n / 8); - const mask = 1 << (n % 8); - return (arr[byte] & mask) === mask; -}; - -const isPaused = () => { - return animationId === null; -}; - -const playPauseButton = document.getElementById("play-pause"); - -const play = () => { - playPauseButton.textContent = "⏸"; - renderLoop(); -}; - -const pause = () => { - playPauseButton.textContent = "▶"; - cancelAnimationFrame(animationId); - animationId = null; -}; - -playPauseButton.addEventListener("click", event => { - if (isPaused()) { - play(); - } else { - pause(); - } -}); - -canvas.addEventListener("click", event => { - const boundingRect = canvas.getBoundingClientRect(); - - const scaleX = canvas.width / boundingRect.width; - const scaleY = canvas.height / boundingRect.height; - - const canvasLeft = (event.clientX - boundingRect.left) * scaleX; - const canvasTop = (event.clientY - boundingRect.top) * scaleY; - - const row = Math.min(Math.floor(canvasTop / (CELL_SIZE + 1)), height - 1); - const col = Math.min(Math.floor(canvasLeft / (CELL_SIZE + 1)), width - 1); - - universe.toggle_cell(row, col); - - drawGrid(); - drawCells(); -}); - -const fps = new class { - constructor() { - this.fps = document.getElementById("fps"); - this.frames = []; - this.lastFrameTimeStamp = performance.now(); - } - - render() { - // Convert the delta time since the last frame render into a measure - // of frames per second. - const now = performance.now(); - const delta = now - this.lastFrameTimeStamp; - this.lastFrameTimeStamp = now; - const fps = 1 / delta * 1000; - - // Save only the latest 100 timings. - this.frames.push(fps); - if (this.frames.length > 100) { - this.frames.shift(); - } - - // Find the max, min, and mean of our 100 latest timings. - let min = Infinity; - let max = -Infinity; - let sum = 0; - for (let i = 0; i < this.frames.length; i++) { - sum += this.frames[i]; - min = Math.min(this.frames[i], min); - max = Math.max(this.frames[i], max); - } - let mean = sum / this.frames.length; - - // Render the statistics. - this.fps.textContent = ` -Frames per Second: - latest = ${Math.round(fps)} -avg of last 100 = ${Math.round(mean)} -min of last 100 = ${Math.round(min)} -max of last 100 = ${Math.round(max)} -`.trim(); - } -}; - -play(); \ No newline at end of file From a1bb82314759e8cbf0ad74c984214ac49eee95b2 Mon Sep 17 00:00:00 2001 From: klangner Date: Sun, 13 Sep 2020 13:26:36 +0200 Subject: [PATCH 4/6] Map generator working in wasm demo --- README.md | 14 ++- demo/Cargo.toml | 8 +- demo/LICENSE-APACHE | 201 ++++++++++++++++++++++++++++++++++++++++++++ demo/src/lib.rs | 58 +++++++++---- src/dungeon/mod.rs | 16 ++-- 5 files changed, 265 insertions(+), 32 deletions(-) create mode 100644 demo/LICENSE-APACHE diff --git a/README.md b/README.md index 13cbdb2..5c1a66b 100644 --- a/README.md +++ b/README.md @@ -6,16 +6,9 @@ Generate procedural maps for games. -This library is based on the code from the [Roguelike tutorial](https://github.com/thebracket/rustrogueliketutorial). -I highly recommend it for learning how to write Roguelike in Rust. - - ## Demo app -If you want to check how the maps look like, then: - * Clone this rep - * Go to the demo folder - * Run demo app (`cargo run`) +Check [demo app](https://klangner.github.io/mapgen.rs/) ## Features @@ -80,6 +73,11 @@ let map = MapBuilder::new(Box::new(CellularAutomataGen::new(80, 50))) For more information check the [doc](https://docs.rs/mapgen) + +This library is based on the code from the [Roguelike tutorial](https://github.com/thebracket/rustrogueliketutorial). +I highly recommend it for learning how to write Roguelike in Rust. + + # License Licensed under either of diff --git a/demo/Cargo.toml b/demo/Cargo.toml index ee0b48d..76bccfc 100644 --- a/demo/Cargo.toml +++ b/demo/Cargo.toml @@ -2,13 +2,19 @@ name = "mapgen-demo" version = "0.1.1" authors = ["Krzysztof Langner "] +description = "Map generator demo" +license = "MIT OR Apache-2.0" +repository = "https://github.com/klangner/mapgen.rs" edition = "2018" [lib] crate-type = ["cdylib"] [dependencies] -wasm-bindgen = "0.2.68" +rand = { version = "0.7", features = ["wasm-bindgen"] } +mapgen = {path=".."} +wasm-bindgen = "0.2" +js-sys = "0.3" [dependencies.web-sys] version = "0.3.4" diff --git a/demo/LICENSE-APACHE b/demo/LICENSE-APACHE new file mode 100644 index 0000000..9e0cec1 --- /dev/null +++ b/demo/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2017 Krzysztof Langner + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/demo/src/lib.rs b/demo/src/lib.rs index 639b37e..2d00577 100644 --- a/demo/src/lib.rs +++ b/demo/src/lib.rs @@ -1,24 +1,46 @@ use wasm_bindgen::prelude::*; +use rand::prelude::*; +use js_sys::Date; +use mapgen::dungeon::{ + MapBuilder, + map::Map, + cellular_automata::CellularAutomataGen, + starting_point::{AreaStartingPosition, XStart, YStart}, + cull_unreachable::CullUnreachable, + distant_exit::DistantExit, +}; -// Called when the wasm module is instantiated -#[wasm_bindgen(start)] -pub fn main() -> Result<(), JsValue> { - // Use `web_sys`'s global `window` function to get a handle on the global - // window object. - let window = web_sys::window().expect("no global `window` exists"); - let document = window.document().expect("should have a document on window"); - let body = document.body().expect("document should have a body"); - // Manufacture the element we're gonna append - let val = document.create_element("p")?; - val.set_inner_html("Hello from Rust! 1"); - - body.append_child(&val)?; - - Ok(()) +#[wasm_bindgen] +pub struct World { + map: Map, } #[wasm_bindgen] -pub fn add(a: u32, b: u32) -> u32 { - a + b -} \ No newline at end of file +impl World { + pub fn new(width: u32, height: u32) -> World { + let seed = Date::new_0().get_time() as u64; + let mut rng = StdRng::seed_from_u64(seed); + let map = MapBuilder::new(Box::new(CellularAutomataGen::new(width as usize, height as usize))) + .with(AreaStartingPosition::new(XStart::CENTER, YStart::CENTER)) + .with(CullUnreachable::new()) + .with(DistantExit::new()) + .build_map_with_rng(&mut rng); + World { map } + } + + pub fn width(&self) -> u32 { + self.map.width as u32 + } + + pub fn height(&self) -> u32 { + self.map.height as u32 + } +} + + +// Called when the wasm module is instantiated +// #[wasm_bindgen(start)] +// pub fn main() -> Result<(), JsValue> { +// Ok(()) +// } \ No newline at end of file diff --git a/src/dungeon/mod.rs b/src/dungeon/mod.rs index 7064e77..484d72b 100644 --- a/src/dungeon/mod.rs +++ b/src/dungeon/mod.rs @@ -53,17 +53,14 @@ pub trait MapModifier { pub struct MapBuilder { generator: Box, modifiers: Vec>, - rng: StdRng, } impl MapBuilder { /// Create Map Builder with initial map generator pub fn new(generator : Box) -> MapBuilder { - let system_time = SystemTime::now().duration_since(UNIX_EPOCH).expect("Can't access system time"); MapBuilder { generator, modifiers: Vec::new(), - rng: StdRng::seed_from_u64(system_time.as_secs()) } } @@ -72,16 +69,25 @@ impl MapBuilder { self } + /// Build map using random number seeded with system time pub fn build_map(&mut self) -> Map { - let mut map = self.generator.generate_map(&mut self.rng); + let system_time = SystemTime::now().duration_since(UNIX_EPOCH).expect("Can't access system time"); + let mut rng = StdRng::seed_from_u64(system_time.as_millis() as u64); + self.build_map_with_rng(&mut rng) + } + + /// Build map using provided random number generator + pub fn build_map_with_rng(&mut self, rng: &mut StdRng) -> Map { + let mut map = self.generator.generate_map(rng); // Build additional layers in turn for modifier in self.modifiers.iter() { - map = modifier.modify_map(&mut self.rng, &map); + map = modifier.modify_map(rng, &map); } map } + } /// ------------------------------------------------------------------------------------------------ From 2904b0d5609941f1f50f7ed544d7139aad632439 Mon Sep 17 00:00:00 2001 From: klangner Date: Sun, 13 Sep 2020 13:29:01 +0200 Subject: [PATCH 5/6] new dist --- docs/0.bootstrap.js | 23 ++++-------- docs/bootstrap.js | 49 +++----------------------- docs/e746eb2fb67992eff455.module.wasm | Bin 0 -> 40976 bytes docs/favicon.ico | Bin 0 -> 32038 bytes docs/index.html | 4 ++- 5 files changed, 14 insertions(+), 62 deletions(-) create mode 100644 docs/e746eb2fb67992eff455.module.wasm create mode 100644 docs/favicon.ico diff --git a/docs/0.bootstrap.js b/docs/0.bootstrap.js index af1b577..8d82562 100644 --- a/docs/0.bootstrap.js +++ b/docs/0.bootstrap.js @@ -4,11 +4,11 @@ /*!*****************************!*\ !*** ../pkg/mapgen_demo.js ***! \*****************************/ -/*! exports provided: main, add, __wbindgen_object_drop_ref, __wbg_instanceof_Window_adf3196bdc02b386, __wbg_document_6cc8d0b87c0a99b9, __wbg_body_8c888fe47d81765f, __wbg_createElement_5bdf88a5af9f17c5, __wbg_setinnerHTML_4ff235db1a3cb4d8, __wbg_appendChild_77215fd672b162c5, __wbg_call_8e95613cc6524977, __wbindgen_object_clone_ref, __wbg_newnoargs_f3b8a801d5d4b079, __wbg_self_07b2f89e82ceb76d, __wbg_window_ba85d88572adc0dc, __wbg_globalThis_b9277fc37e201fe5, __wbg_global_e16303fe83e1d57f, __wbindgen_is_undefined, __wbindgen_throw, __wbindgen_rethrow */ +/*! exports provided: World, __wbindgen_object_drop_ref, __wbg_getTime_29addd71c7089c47, __wbg_new0_a3af66503e735141, __wbindgen_throw */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mapgen_demo_bg.wasm */ \"../pkg/mapgen_demo_bg.wasm\");\n/* harmony import */ var _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mapgen_demo_bg.js */ \"../pkg/mapgen_demo_bg.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"main\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"main\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"add\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"add\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_object_drop_ref\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_instanceof_Window_adf3196bdc02b386\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_instanceof_Window_adf3196bdc02b386\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_document_6cc8d0b87c0a99b9\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_document_6cc8d0b87c0a99b9\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_body_8c888fe47d81765f\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_body_8c888fe47d81765f\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_createElement_5bdf88a5af9f17c5\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_createElement_5bdf88a5af9f17c5\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_setinnerHTML_4ff235db1a3cb4d8\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_setinnerHTML_4ff235db1a3cb4d8\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_appendChild_77215fd672b162c5\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_appendChild_77215fd672b162c5\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_call_8e95613cc6524977\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_call_8e95613cc6524977\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_clone_ref\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_object_clone_ref\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_newnoargs_f3b8a801d5d4b079\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_newnoargs_f3b8a801d5d4b079\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_self_07b2f89e82ceb76d\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_self_07b2f89e82ceb76d\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_window_ba85d88572adc0dc\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_window_ba85d88572adc0dc\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_globalThis_b9277fc37e201fe5\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_globalThis_b9277fc37e201fe5\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_global_e16303fe83e1d57f\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_global_e16303fe83e1d57f\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_undefined\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_is_undefined\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_throw\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_rethrow\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_rethrow\"]; });\n\n\n\n_mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_start\"]();\n\n\n//# sourceURL=webpack:///../pkg/mapgen_demo.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mapgen_demo_bg.wasm */ \"../pkg/mapgen_demo_bg.wasm\");\n/* harmony import */ var _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mapgen_demo_bg.js */ \"../pkg/mapgen_demo_bg.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"World\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"World\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_object_drop_ref\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_getTime_29addd71c7089c47\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_getTime_29addd71c7089c47\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_new0_a3af66503e735141\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_new0_a3af66503e735141\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return _mapgen_demo_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_throw\"]; });\n\n\n\n\n//# sourceURL=webpack:///../pkg/mapgen_demo.js?"); /***/ }), @@ -16,11 +16,11 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _map /*!********************************!*\ !*** ../pkg/mapgen_demo_bg.js ***! \********************************/ -/*! exports provided: main, add, __wbindgen_object_drop_ref, __wbg_instanceof_Window_adf3196bdc02b386, __wbg_document_6cc8d0b87c0a99b9, __wbg_body_8c888fe47d81765f, __wbg_createElement_5bdf88a5af9f17c5, __wbg_setinnerHTML_4ff235db1a3cb4d8, __wbg_appendChild_77215fd672b162c5, __wbg_call_8e95613cc6524977, __wbindgen_object_clone_ref, __wbg_newnoargs_f3b8a801d5d4b079, __wbg_self_07b2f89e82ceb76d, __wbg_window_ba85d88572adc0dc, __wbg_globalThis_b9277fc37e201fe5, __wbg_global_e16303fe83e1d57f, __wbindgen_is_undefined, __wbindgen_throw, __wbindgen_rethrow */ +/*! exports provided: World, __wbindgen_object_drop_ref, __wbg_getTime_29addd71c7089c47, __wbg_new0_a3af66503e735141, __wbindgen_throw */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(module, global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"main\", function() { return main; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"add\", function() { return add; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return __wbindgen_object_drop_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_instanceof_Window_adf3196bdc02b386\", function() { return __wbg_instanceof_Window_adf3196bdc02b386; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_document_6cc8d0b87c0a99b9\", function() { return __wbg_document_6cc8d0b87c0a99b9; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_body_8c888fe47d81765f\", function() { return __wbg_body_8c888fe47d81765f; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_createElement_5bdf88a5af9f17c5\", function() { return __wbg_createElement_5bdf88a5af9f17c5; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_setinnerHTML_4ff235db1a3cb4d8\", function() { return __wbg_setinnerHTML_4ff235db1a3cb4d8; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_appendChild_77215fd672b162c5\", function() { return __wbg_appendChild_77215fd672b162c5; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_call_8e95613cc6524977\", function() { return __wbg_call_8e95613cc6524977; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_clone_ref\", function() { return __wbindgen_object_clone_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_newnoargs_f3b8a801d5d4b079\", function() { return __wbg_newnoargs_f3b8a801d5d4b079; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_self_07b2f89e82ceb76d\", function() { return __wbg_self_07b2f89e82ceb76d; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_window_ba85d88572adc0dc\", function() { return __wbg_window_ba85d88572adc0dc; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_globalThis_b9277fc37e201fe5\", function() { return __wbg_globalThis_b9277fc37e201fe5; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_global_e16303fe83e1d57f\", function() { return __wbg_global_e16303fe83e1d57f; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_undefined\", function() { return __wbindgen_is_undefined; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return __wbindgen_throw; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_rethrow\", function() { return __wbindgen_rethrow; });\n/* harmony import */ var _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mapgen_demo_bg.wasm */ \"../pkg/mapgen_demo_bg.wasm\");\n\n\nconst heap = new Array(32).fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nfunction getObject(idx) { return heap[idx]; }\n\nlet heap_next = heap.length;\n\nfunction dropObject(idx) {\n if (idx < 36) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n\nfunction addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n}\n\nconst lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder;\n\nlet cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n\ncachedTextDecoder.decode();\n\nlet cachegetUint8Memory0 = null;\nfunction getUint8Memory0() {\n if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetUint8Memory0 = new Uint8Array(_mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetUint8Memory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));\n}\n/**\n*/\nfunction main() {\n _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"main\"]();\n}\n\n/**\n* @param {number} a\n* @param {number} b\n* @returns {number}\n*/\nfunction add(a, b) {\n var ret = _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"add\"](a, b);\n return ret >>> 0;\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nfunction handleError(f) {\n return function () {\n try {\n return f.apply(this, arguments);\n\n } catch (e) {\n _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_exn_store\"](addHeapObject(e));\n }\n };\n}\n\nconst __wbindgen_object_drop_ref = function(arg0) {\n takeObject(arg0);\n};\n\nconst __wbg_instanceof_Window_adf3196bdc02b386 = function(arg0) {\n var ret = getObject(arg0) instanceof Window;\n return ret;\n};\n\nconst __wbg_document_6cc8d0b87c0a99b9 = function(arg0) {\n var ret = getObject(arg0).document;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n};\n\nconst __wbg_body_8c888fe47d81765f = function(arg0) {\n var ret = getObject(arg0).body;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n};\n\nconst __wbg_createElement_5bdf88a5af9f17c5 = handleError(function(arg0, arg1, arg2) {\n var ret = getObject(arg0).createElement(getStringFromWasm0(arg1, arg2));\n return addHeapObject(ret);\n});\n\nconst __wbg_setinnerHTML_4ff235db1a3cb4d8 = function(arg0, arg1, arg2) {\n getObject(arg0).innerHTML = getStringFromWasm0(arg1, arg2);\n};\n\nconst __wbg_appendChild_77215fd672b162c5 = handleError(function(arg0, arg1) {\n var ret = getObject(arg0).appendChild(getObject(arg1));\n return addHeapObject(ret);\n});\n\nconst __wbg_call_8e95613cc6524977 = handleError(function(arg0, arg1) {\n var ret = getObject(arg0).call(getObject(arg1));\n return addHeapObject(ret);\n});\n\nconst __wbindgen_object_clone_ref = function(arg0) {\n var ret = getObject(arg0);\n return addHeapObject(ret);\n};\n\nconst __wbg_newnoargs_f3b8a801d5d4b079 = function(arg0, arg1) {\n var ret = new Function(getStringFromWasm0(arg0, arg1));\n return addHeapObject(ret);\n};\n\nconst __wbg_self_07b2f89e82ceb76d = handleError(function() {\n var ret = self.self;\n return addHeapObject(ret);\n});\n\nconst __wbg_window_ba85d88572adc0dc = handleError(function() {\n var ret = window.window;\n return addHeapObject(ret);\n});\n\nconst __wbg_globalThis_b9277fc37e201fe5 = handleError(function() {\n var ret = globalThis.globalThis;\n return addHeapObject(ret);\n});\n\nconst __wbg_global_e16303fe83e1d57f = handleError(function() {\n var ret = global.global;\n return addHeapObject(ret);\n});\n\nconst __wbindgen_is_undefined = function(arg0) {\n var ret = getObject(arg0) === undefined;\n return ret;\n};\n\nconst __wbindgen_throw = function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n};\n\nconst __wbindgen_rethrow = function(arg0) {\n throw takeObject(arg0);\n};\n\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../www/node_modules/webpack/buildin/harmony-module.js */ \"./node_modules/webpack/buildin/harmony-module.js\")(module), __webpack_require__(/*! ./../www/node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack:///../pkg/mapgen_demo_bg.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(module) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"World\", function() { return World; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return __wbindgen_object_drop_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_getTime_29addd71c7089c47\", function() { return __wbg_getTime_29addd71c7089c47; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_new0_a3af66503e735141\", function() { return __wbg_new0_a3af66503e735141; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return __wbindgen_throw; });\n/* harmony import */ var _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mapgen_demo_bg.wasm */ \"../pkg/mapgen_demo_bg.wasm\");\n\n\nconst heap = new Array(32).fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nfunction getObject(idx) { return heap[idx]; }\n\nlet heap_next = heap.length;\n\nfunction dropObject(idx) {\n if (idx < 36) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n\nconst lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder;\n\nlet cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n\ncachedTextDecoder.decode();\n\nlet cachegetUint8Memory0 = null;\nfunction getUint8Memory0() {\n if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetUint8Memory0 = new Uint8Array(_mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetUint8Memory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));\n}\n\nfunction addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n}\n/**\n*/\nclass World {\n\n static __wrap(ptr) {\n const obj = Object.create(World.prototype);\n obj.ptr = ptr;\n\n return obj;\n }\n\n free() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_world_free\"](ptr);\n }\n /**\n * @param {number} width\n * @param {number} height\n * @returns {World}\n */\n static new(width, height) {\n var ret = _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"world_new\"](width, height);\n return World.__wrap(ret);\n }\n /**\n * @returns {number}\n */\n width() {\n var ret = _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"world_width\"](this.ptr);\n return ret >>> 0;\n }\n /**\n * @returns {number}\n */\n height() {\n var ret = _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"world_height\"](this.ptr);\n return ret >>> 0;\n }\n}\n\nconst __wbindgen_object_drop_ref = function(arg0) {\n takeObject(arg0);\n};\n\nconst __wbg_getTime_29addd71c7089c47 = function(arg0) {\n var ret = getObject(arg0).getTime();\n return ret;\n};\n\nconst __wbg_new0_a3af66503e735141 = function() {\n var ret = new Date();\n return addHeapObject(ret);\n};\n\nconst __wbindgen_throw = function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n};\n\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../www/node_modules/webpack/buildin/harmony-module.js */ \"./node_modules/webpack/buildin/harmony-module.js\")(module)))\n\n//# sourceURL=webpack:///../pkg/mapgen_demo_bg.js?"); /***/ }), @@ -28,7 +28,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /*!**********************************!*\ !*** ../pkg/mapgen_demo_bg.wasm ***! \**********************************/ -/*! exports provided: memory, main, add, __wbindgen_exn_store, __wbindgen_start */ +/*! exports provided: memory, __wbg_world_free, world_new, world_width, world_height */ /***/ (function(module, exports, __webpack_require__) { eval("\"use strict\";\n// Instantiate WebAssembly module\nvar wasmExports = __webpack_require__.w[module.i];\n__webpack_require__.r(exports);\n// export exports from WebAssembly module\nfor(var name in wasmExports) if(name != \"__webpack_init__\") exports[name] = wasmExports[name];\n// exec imports from WebAssembly module (for esm order)\n/* harmony import */ var m0 = __webpack_require__(/*! ./mapgen_demo_bg.js */ \"../pkg/mapgen_demo_bg.js\");\n\n\n// exec wasm module\nwasmExports[\"__webpack_init__\"]()\n\n//# sourceURL=webpack:///../pkg/mapgen_demo_bg.wasm?"); @@ -43,18 +43,7 @@ eval("\"use strict\";\n// Instantiate WebAssembly module\nvar wasmExports = __we /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var mapgen_demo__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mapgen-demo */ \"../pkg/mapgen_demo.js\");\n\n\nconst x = mapgen_demo__WEBPACK_IMPORTED_MODULE_0__[\"add\"](1, 4);\nconsole.log(x);\n\n\n//# sourceURL=webpack:///./index.js?"); - -/***/ }), - -/***/ "./node_modules/webpack/buildin/global.js": -/*!***********************************!*\ - !*** (webpack)/buildin/global.js ***! - \***********************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n//# sourceURL=webpack:///(webpack)/buildin/global.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var mapgen_demo__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mapgen-demo */ \"../pkg/mapgen_demo.js\");\n/* harmony import */ var mapgen_demo_mapgen_demo_bg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! mapgen-demo/mapgen_demo_bg */ \"../pkg/mapgen_demo_bg.wasm\");\n\n\n\nconst CELL_SIZE = 8; // px\nconst GRID_COLOR = \"#CCCCCC\";\nconst DEAD_COLOR = \"#FFFFFF\";\nconst ALIVE_COLOR = \"#000000\";\n\nconst world = mapgen_demo__WEBPACK_IMPORTED_MODULE_0__[\"World\"].new(80, 50);\nconst width = world.width();\nconst height = world.height();\n\n// Give the canvas room for all of our cells and a 1px border\n// around each of them.\nconst canvas = document.getElementById(\"mapgen-canvas\");\ncanvas.height = (CELL_SIZE + 1) * height + 1;\ncanvas.width = (CELL_SIZE + 1) * width + 1;\n\nconst ctx = canvas.getContext('2d');\n\nconst renderLoop = () => {\n // universe.tick();\n\n drawGrid();\n // drawCells();\n\n requestAnimationFrame(renderLoop);\n};\n\nconst drawGrid = () => {\n ctx.beginPath();\n ctx.strokeStyle = GRID_COLOR;\n\n // Vertical lines.\n for (let i = 0; i <= width; i++) {\n ctx.moveTo(i * (CELL_SIZE + 1) + 1, 0);\n ctx.lineTo(i * (CELL_SIZE + 1) + 1, (CELL_SIZE + 1) * height + 1);\n }\n\n // Horizontal lines.\n for (let j = 0; j <= height; j++) {\n ctx.moveTo(0, j * (CELL_SIZE + 1) + 1);\n ctx.lineTo((CELL_SIZE + 1) * width + 1, j * (CELL_SIZE + 1) + 1);\n }\n\n ctx.stroke();\n};\n\nconst getIndex = (row, column) => {\n return row * width + column;\n};\n\n// const drawCells = () => {\n// const cellsPtr = universe.cells();\n// const cells = new Uint8Array(memory.buffer, cellsPtr, width * height);\n\n// ctx.beginPath();\n\n// for (let row = 0; row < height; row++) {\n// for (let col = 0; col < width; col++) {\n// const idx = getIndex(row, col);\n\n// ctx.fillStyle = cells[idx] === Cell.Dead\n// ? DEAD_COLOR\n// : ALIVE_COLOR;\n\n// ctx.fillRect(\n// col * (CELL_SIZE + 1) + 1,\n// row * (CELL_SIZE + 1) + 1,\n// CELL_SIZE,\n// CELL_SIZE\n// );\n// }\n// }\n\n// ctx.stroke();\n// };\n\ndrawGrid();\n// drawCells();\nrequestAnimationFrame(renderLoop);\n\n//# sourceURL=webpack:///./index.js?"); /***/ }), diff --git a/docs/bootstrap.js b/docs/bootstrap.js index 98abbdc..2a48f55 100644 --- a/docs/bootstrap.js +++ b/docs/bootstrap.js @@ -58,53 +58,14 @@ /******/ "__wbindgen_object_drop_ref": function(p0i32) { /******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbindgen_object_drop_ref"](p0i32); /******/ }, -/******/ "__wbg_instanceof_Window_adf3196bdc02b386": function(p0i32) { -/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_instanceof_Window_adf3196bdc02b386"](p0i32); +/******/ "__wbg_getTime_29addd71c7089c47": function(p0i32) { +/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_getTime_29addd71c7089c47"](p0i32); /******/ }, -/******/ "__wbg_document_6cc8d0b87c0a99b9": function(p0i32) { -/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_document_6cc8d0b87c0a99b9"](p0i32); -/******/ }, -/******/ "__wbg_body_8c888fe47d81765f": function(p0i32) { -/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_body_8c888fe47d81765f"](p0i32); -/******/ }, -/******/ "__wbg_createElement_5bdf88a5af9f17c5": function(p0i32,p1i32,p2i32) { -/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_createElement_5bdf88a5af9f17c5"](p0i32,p1i32,p2i32); -/******/ }, -/******/ "__wbg_setinnerHTML_4ff235db1a3cb4d8": function(p0i32,p1i32,p2i32) { -/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_setinnerHTML_4ff235db1a3cb4d8"](p0i32,p1i32,p2i32); -/******/ }, -/******/ "__wbg_appendChild_77215fd672b162c5": function(p0i32,p1i32) { -/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_appendChild_77215fd672b162c5"](p0i32,p1i32); -/******/ }, -/******/ "__wbg_call_8e95613cc6524977": function(p0i32,p1i32) { -/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_call_8e95613cc6524977"](p0i32,p1i32); -/******/ }, -/******/ "__wbindgen_object_clone_ref": function(p0i32) { -/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbindgen_object_clone_ref"](p0i32); -/******/ }, -/******/ "__wbg_newnoargs_f3b8a801d5d4b079": function(p0i32,p1i32) { -/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_newnoargs_f3b8a801d5d4b079"](p0i32,p1i32); -/******/ }, -/******/ "__wbg_self_07b2f89e82ceb76d": function() { -/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_self_07b2f89e82ceb76d"](); -/******/ }, -/******/ "__wbg_window_ba85d88572adc0dc": function() { -/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_window_ba85d88572adc0dc"](); -/******/ }, -/******/ "__wbg_globalThis_b9277fc37e201fe5": function() { -/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_globalThis_b9277fc37e201fe5"](); -/******/ }, -/******/ "__wbg_global_e16303fe83e1d57f": function() { -/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_global_e16303fe83e1d57f"](); -/******/ }, -/******/ "__wbindgen_is_undefined": function(p0i32) { -/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbindgen_is_undefined"](p0i32); +/******/ "__wbg_new0_a3af66503e735141": function() { +/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbg_new0_a3af66503e735141"](); /******/ }, /******/ "__wbindgen_throw": function(p0i32,p1i32) { /******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbindgen_throw"](p0i32,p1i32); -/******/ }, -/******/ "__wbindgen_rethrow": function(p0i32) { -/******/ return installedModules["../pkg/mapgen_demo_bg.js"].exports["__wbindgen_rethrow"](p0i32); /******/ } /******/ } /******/ }; @@ -207,7 +168,7 @@ /******/ promises.push(installedWasmModuleData); /******/ else { /******/ var importObject = wasmImportObjects[wasmModuleId](); -/******/ var req = fetch(__webpack_require__.p + "" + {"../pkg/mapgen_demo_bg.wasm":"f138b06b088ae74c6a29"}[wasmModuleId] + ".module.wasm"); +/******/ var req = fetch(__webpack_require__.p + "" + {"../pkg/mapgen_demo_bg.wasm":"e746eb2fb67992eff455"}[wasmModuleId] + ".module.wasm"); /******/ var promise; /******/ if(importObject instanceof Promise && typeof WebAssembly.compileStreaming === 'function') { /******/ promise = Promise.all([WebAssembly.compileStreaming(req), importObject]).then(function(items) { diff --git a/docs/e746eb2fb67992eff455.module.wasm b/docs/e746eb2fb67992eff455.module.wasm new file mode 100644 index 0000000000000000000000000000000000000000..9daeebef6bd30c032530c64e72ec7ea42cee1b68 GIT binary patch literal 40976 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 b`&qpnJ?A{A;~ckn7wBQ^A-$%5RZ0C1O6A2g literal 0 HcmV?d00001 diff --git a/docs/index.html b/docs/index.html index ca5615c..80e6e05 100644 --- a/docs/index.html +++ b/docs/index.html @@ -2,9 +2,11 @@ - Hello wasm-pack! + Mapgen demo +

Mapgen demo

+ From 05151d81628941fb97290f04be785b4fb116d739 Mon Sep 17 00:00:00 2001 From: klangner Date: Sun, 13 Sep 2020 14:43:59 +0200 Subject: [PATCH 6/6] New demo working --- demo/src/lib.rs | 20 +++++++++++++++----- docs/0.bootstrap.js | 6 +++--- docs/bf853f7fb17b7aed38db.module.wasm | Bin 0 -> 41033 bytes docs/bootstrap.js | 2 +- docs/e746eb2fb67992eff455.module.wasm | Bin 40976 -> 0 bytes docs/f138b06b088ae74c6a29.module.wasm | Bin 17489 -> 0 bytes 6 files changed, 19 insertions(+), 9 deletions(-) create mode 100644 docs/bf853f7fb17b7aed38db.module.wasm delete mode 100644 docs/e746eb2fb67992eff455.module.wasm delete mode 100644 docs/f138b06b088ae74c6a29.module.wasm diff --git a/demo/src/lib.rs b/demo/src/lib.rs index 2d00577..993c453 100644 --- a/demo/src/lib.rs +++ b/demo/src/lib.rs @@ -3,7 +3,7 @@ use rand::prelude::*; use js_sys::Date; use mapgen::dungeon::{ MapBuilder, - map::Map, + map::TileType, cellular_automata::CellularAutomataGen, starting_point::{AreaStartingPosition, XStart, YStart}, cull_unreachable::CullUnreachable, @@ -13,7 +13,9 @@ use mapgen::dungeon::{ #[wasm_bindgen] pub struct World { - map: Map, + width: u32, + height: u32, + tiles: Vec, } #[wasm_bindgen] @@ -26,15 +28,23 @@ impl World { .with(CullUnreachable::new()) .with(DistantExit::new()) .build_map_with_rng(&mut rng); - World { map } + let tiles = (0..map.tiles.len()).map(|i| map.tiles[i] == TileType::Floor).collect(); + World { + width, + height, + tiles } } pub fn width(&self) -> u32 { - self.map.width as u32 + self.width } pub fn height(&self) -> u32 { - self.map.height as u32 + self.height + } + + pub fn tiles(&self) -> *const bool { + self.tiles.as_ptr() } } diff --git a/docs/0.bootstrap.js b/docs/0.bootstrap.js index 8d82562..e0ae0ba 100644 --- a/docs/0.bootstrap.js +++ b/docs/0.bootstrap.js @@ -20,7 +20,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _map /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(module) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"World\", function() { return World; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return __wbindgen_object_drop_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_getTime_29addd71c7089c47\", function() { return __wbg_getTime_29addd71c7089c47; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_new0_a3af66503e735141\", function() { return __wbg_new0_a3af66503e735141; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return __wbindgen_throw; });\n/* harmony import */ var _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mapgen_demo_bg.wasm */ \"../pkg/mapgen_demo_bg.wasm\");\n\n\nconst heap = new Array(32).fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nfunction getObject(idx) { return heap[idx]; }\n\nlet heap_next = heap.length;\n\nfunction dropObject(idx) {\n if (idx < 36) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n\nconst lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder;\n\nlet cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n\ncachedTextDecoder.decode();\n\nlet cachegetUint8Memory0 = null;\nfunction getUint8Memory0() {\n if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetUint8Memory0 = new Uint8Array(_mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetUint8Memory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));\n}\n\nfunction addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n}\n/**\n*/\nclass World {\n\n static __wrap(ptr) {\n const obj = Object.create(World.prototype);\n obj.ptr = ptr;\n\n return obj;\n }\n\n free() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_world_free\"](ptr);\n }\n /**\n * @param {number} width\n * @param {number} height\n * @returns {World}\n */\n static new(width, height) {\n var ret = _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"world_new\"](width, height);\n return World.__wrap(ret);\n }\n /**\n * @returns {number}\n */\n width() {\n var ret = _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"world_width\"](this.ptr);\n return ret >>> 0;\n }\n /**\n * @returns {number}\n */\n height() {\n var ret = _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"world_height\"](this.ptr);\n return ret >>> 0;\n }\n}\n\nconst __wbindgen_object_drop_ref = function(arg0) {\n takeObject(arg0);\n};\n\nconst __wbg_getTime_29addd71c7089c47 = function(arg0) {\n var ret = getObject(arg0).getTime();\n return ret;\n};\n\nconst __wbg_new0_a3af66503e735141 = function() {\n var ret = new Date();\n return addHeapObject(ret);\n};\n\nconst __wbindgen_throw = function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n};\n\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../www/node_modules/webpack/buildin/harmony-module.js */ \"./node_modules/webpack/buildin/harmony-module.js\")(module)))\n\n//# sourceURL=webpack:///../pkg/mapgen_demo_bg.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(module) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"World\", function() { return World; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return __wbindgen_object_drop_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_getTime_29addd71c7089c47\", function() { return __wbg_getTime_29addd71c7089c47; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_new0_a3af66503e735141\", function() { return __wbg_new0_a3af66503e735141; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return __wbindgen_throw; });\n/* harmony import */ var _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mapgen_demo_bg.wasm */ \"../pkg/mapgen_demo_bg.wasm\");\n\n\nconst heap = new Array(32).fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nfunction getObject(idx) { return heap[idx]; }\n\nlet heap_next = heap.length;\n\nfunction dropObject(idx) {\n if (idx < 36) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n\nconst lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder;\n\nlet cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n\ncachedTextDecoder.decode();\n\nlet cachegetUint8Memory0 = null;\nfunction getUint8Memory0() {\n if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetUint8Memory0 = new Uint8Array(_mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetUint8Memory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));\n}\n\nfunction addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n}\n/**\n*/\nclass World {\n\n static __wrap(ptr) {\n const obj = Object.create(World.prototype);\n obj.ptr = ptr;\n\n return obj;\n }\n\n free() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_world_free\"](ptr);\n }\n /**\n * @param {number} width\n * @param {number} height\n * @returns {World}\n */\n static new(width, height) {\n var ret = _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"world_new\"](width, height);\n return World.__wrap(ret);\n }\n /**\n * @returns {number}\n */\n width() {\n var ret = _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"world_width\"](this.ptr);\n return ret >>> 0;\n }\n /**\n * @returns {number}\n */\n height() {\n var ret = _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"world_height\"](this.ptr);\n return ret >>> 0;\n }\n /**\n * @returns {number}\n */\n tiles() {\n var ret = _mapgen_demo_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"world_tiles\"](this.ptr);\n return ret;\n }\n}\n\nconst __wbindgen_object_drop_ref = function(arg0) {\n takeObject(arg0);\n};\n\nconst __wbg_getTime_29addd71c7089c47 = function(arg0) {\n var ret = getObject(arg0).getTime();\n return ret;\n};\n\nconst __wbg_new0_a3af66503e735141 = function() {\n var ret = new Date();\n return addHeapObject(ret);\n};\n\nconst __wbindgen_throw = function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n};\n\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../www/node_modules/webpack/buildin/harmony-module.js */ \"./node_modules/webpack/buildin/harmony-module.js\")(module)))\n\n//# sourceURL=webpack:///../pkg/mapgen_demo_bg.js?"); /***/ }), @@ -28,7 +28,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(f /*!**********************************!*\ !*** ../pkg/mapgen_demo_bg.wasm ***! \**********************************/ -/*! exports provided: memory, __wbg_world_free, world_new, world_width, world_height */ +/*! exports provided: memory, __wbg_world_free, world_new, world_width, world_height, world_tiles */ /***/ (function(module, exports, __webpack_require__) { eval("\"use strict\";\n// Instantiate WebAssembly module\nvar wasmExports = __webpack_require__.w[module.i];\n__webpack_require__.r(exports);\n// export exports from WebAssembly module\nfor(var name in wasmExports) if(name != \"__webpack_init__\") exports[name] = wasmExports[name];\n// exec imports from WebAssembly module (for esm order)\n/* harmony import */ var m0 = __webpack_require__(/*! ./mapgen_demo_bg.js */ \"../pkg/mapgen_demo_bg.js\");\n\n\n// exec wasm module\nwasmExports[\"__webpack_init__\"]()\n\n//# sourceURL=webpack:///../pkg/mapgen_demo_bg.wasm?"); @@ -43,7 +43,7 @@ eval("\"use strict\";\n// Instantiate WebAssembly module\nvar wasmExports = __we /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var mapgen_demo__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mapgen-demo */ \"../pkg/mapgen_demo.js\");\n/* harmony import */ var mapgen_demo_mapgen_demo_bg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! mapgen-demo/mapgen_demo_bg */ \"../pkg/mapgen_demo_bg.wasm\");\n\n\n\nconst CELL_SIZE = 8; // px\nconst GRID_COLOR = \"#CCCCCC\";\nconst DEAD_COLOR = \"#FFFFFF\";\nconst ALIVE_COLOR = \"#000000\";\n\nconst world = mapgen_demo__WEBPACK_IMPORTED_MODULE_0__[\"World\"].new(80, 50);\nconst width = world.width();\nconst height = world.height();\n\n// Give the canvas room for all of our cells and a 1px border\n// around each of them.\nconst canvas = document.getElementById(\"mapgen-canvas\");\ncanvas.height = (CELL_SIZE + 1) * height + 1;\ncanvas.width = (CELL_SIZE + 1) * width + 1;\n\nconst ctx = canvas.getContext('2d');\n\nconst renderLoop = () => {\n // universe.tick();\n\n drawGrid();\n // drawCells();\n\n requestAnimationFrame(renderLoop);\n};\n\nconst drawGrid = () => {\n ctx.beginPath();\n ctx.strokeStyle = GRID_COLOR;\n\n // Vertical lines.\n for (let i = 0; i <= width; i++) {\n ctx.moveTo(i * (CELL_SIZE + 1) + 1, 0);\n ctx.lineTo(i * (CELL_SIZE + 1) + 1, (CELL_SIZE + 1) * height + 1);\n }\n\n // Horizontal lines.\n for (let j = 0; j <= height; j++) {\n ctx.moveTo(0, j * (CELL_SIZE + 1) + 1);\n ctx.lineTo((CELL_SIZE + 1) * width + 1, j * (CELL_SIZE + 1) + 1);\n }\n\n ctx.stroke();\n};\n\nconst getIndex = (row, column) => {\n return row * width + column;\n};\n\n// const drawCells = () => {\n// const cellsPtr = universe.cells();\n// const cells = new Uint8Array(memory.buffer, cellsPtr, width * height);\n\n// ctx.beginPath();\n\n// for (let row = 0; row < height; row++) {\n// for (let col = 0; col < width; col++) {\n// const idx = getIndex(row, col);\n\n// ctx.fillStyle = cells[idx] === Cell.Dead\n// ? DEAD_COLOR\n// : ALIVE_COLOR;\n\n// ctx.fillRect(\n// col * (CELL_SIZE + 1) + 1,\n// row * (CELL_SIZE + 1) + 1,\n// CELL_SIZE,\n// CELL_SIZE\n// );\n// }\n// }\n\n// ctx.stroke();\n// };\n\ndrawGrid();\n// drawCells();\nrequestAnimationFrame(renderLoop);\n\n//# sourceURL=webpack:///./index.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var mapgen_demo__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mapgen-demo */ \"../pkg/mapgen_demo.js\");\n/* harmony import */ var mapgen_demo_mapgen_demo_bg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! mapgen-demo/mapgen_demo_bg */ \"../pkg/mapgen_demo_bg.wasm\");\n\n\n\nconst CELL_SIZE = 12;\nconst GRID_COLOR = \"#CCCCCC\";\nconst DEAD_COLOR = \"#FFFFFF\";\nconst ALIVE_COLOR = \"#000000\";\n\nconst world = mapgen_demo__WEBPACK_IMPORTED_MODULE_0__[\"World\"].new(80, 50);\nconst width = world.width();\nconst height = world.height();\n\n// Give the canvas room for all of our cells and a 1px border\n// around each of them.\nconst canvas = document.getElementById(\"mapgen-canvas\");\ncanvas.height = (CELL_SIZE + 1) * height + 1;\ncanvas.width = (CELL_SIZE + 1) * width + 1;\n\nconst ctx = canvas.getContext('2d');\n\nconst renderLoop = () => {\n // universe.tick();\n\n drawGrid();\n drawCells();\n\n requestAnimationFrame(renderLoop);\n};\n\nconst drawGrid = () => {\n ctx.beginPath();\n ctx.strokeStyle = GRID_COLOR;\n\n // Vertical lines.\n for (let i = 0; i <= width; i++) {\n ctx.moveTo(i * (CELL_SIZE + 1) + 1, 0);\n ctx.lineTo(i * (CELL_SIZE + 1) + 1, (CELL_SIZE + 1) * height + 1);\n }\n\n // Horizontal lines.\n for (let j = 0; j <= height; j++) {\n ctx.moveTo(0, j * (CELL_SIZE + 1) + 1);\n ctx.lineTo((CELL_SIZE + 1) * width + 1, j * (CELL_SIZE + 1) + 1);\n }\n\n ctx.stroke();\n};\n\nconst getIndex = (row, column) => {\n return row * width + column;\n};\n\nconst drawCells = () => {\n const tilesPtr = world.tiles();\n const tiles = new Uint8Array(mapgen_demo_mapgen_demo_bg__WEBPACK_IMPORTED_MODULE_1__[\"memory\"].buffer, tilesPtr, width * height);\n\n ctx.beginPath();\n\n for (let row = 0; row < height; row++) {\n for (let col = 0; col < width; col++) {\n const idx = getIndex(row, col);\n\n ctx.fillStyle = tiles[idx]\n ? DEAD_COLOR\n : ALIVE_COLOR;\n\n ctx.fillRect(\n col * (CELL_SIZE + 1) + 1,\n row * (CELL_SIZE + 1) + 1,\n CELL_SIZE,\n CELL_SIZE\n );\n }\n }\n\n ctx.stroke();\n};\n\ndrawGrid();\ndrawCells();\nrequestAnimationFrame(renderLoop);\n\n//# sourceURL=webpack:///./index.js?"); /***/ }), diff --git a/docs/bf853f7fb17b7aed38db.module.wasm b/docs/bf853f7fb17b7aed38db.module.wasm new file mode 100644 index 0000000000000000000000000000000000000000..3874075a043f54a8b8e51db66c2ce6702a0f3177 GIT binary patch literal 41033 zcmeIbeUP11e&_eR+47d7dN z{H^#q6@MeV!Mn+eVagYPl`O@Tn>TNHZu;oKnIn4-%se-@_vwS1+sD`L-TVC0hmIW3 z=-kuonf(iU56sUU-8(lg*)}a!Mz7(7QTMyxtYDAJEjjDI54qw|HR1Tj{Rd3 z(XH2eY1qGXWajyiz0=#KpBW$DKC*3QV%zquV_T!f_1#sdFeAlDD{?-wEzl-u{JfU&b@g$;GX=h(> z{dVmt&3pZQ=bP0$RvS;6G=1Yq!`1Rr?d*v>d8#tylKgzqZtVilqbYC=5#9b`o;)!G zd9BBisg%byB#Q~yEk*XyhU9#b-StBazma6_hdbSGzmz?-GkqcZ^6Ra;-BUZ07qYLs z-gV7B@BTsBx;Ovl|I6ur z)z`W&|KMMK_fKoB`}4up;{tOw$!e_!b@ghJ^|d~yt8+=#-+D+_uO-<)>tR=G-Rk;U zx4Hh-8aL3ooqm)4TKb=-ze!KN0u`-wx;m3&gRMzjy_{tAR!di>ldRg>;VP{mH`p3> z_14X<+FDJ21^rd@SJJ=9B^%QV3G_li)@W^ZPraVq(c0n~t)1?U)+4mH(B2tH7zre8 z4J3{RlDCEXW8wbxaDP19p9uG}(Em)hzdk(wS(YVrw~Qw**JHLxv+ay| zY~B?vYiCR@VENUaNtxU+)5i2_|MwhI=kFPm?==~Ox%F12_H@1V8MQCfTkF*>)?1$i z;?98oBLU8a0DLOof4K+Ll`i}*d;C|siFU>;hX2iOyqz(X;XmxQw=?E3{D<6FJ7aRg zf2n8E691)u|D|R4j|Kd<2mHqa{uAK8IpDt~z{vyf2Lk>VdO%(5!vBKDf1BIU&cf5K zOj-w9#B`hXu9lanh8#Xfi#4CessWGChGN>B+i4(_{eF3TW&I zG+pQcb+L=43!bK1-8SL3uASW)Xu8dfY6K;@Eljq?ZPiGtovjIAZg(RZLB(zlG@a`K zRMK=V&~$zoO{P20WV!=QraRCi-Khkc1_Q8qKm(U7rsrpRK%MQP>5Ql8e&JSe&2|=E zarbFt(5-D}#boztr0G82&ejGn8#VHIx2c_N3N$VD04ix(3^biyMw96iG?_j@lj##Q zNuO>CG@(Z(=;)P+3wmZWyWxV=h_*sO54#UMpnAJ+8LAEq<5lE zj4@L9np@B(MtCc@qWo$PppvGmwV+Q1`4`ithXNuG2JnSGp=UC!TqK24v{8$$#= zGM1uOwod4o(R85))Wt5EE_j-@3Ac4_OFQFLn`%@eEw{OyF}Y2eqfd-6Quw3?&?iQC zt8j4VdH|I)oeMObUq;iX>C@)}BFz9Ey)v56Go$HD52&+UG@bD@-7nlK?w)qWt47m( z8fm(_+ZmG^O?S9^HO5Hcry6dfMtCc@v3#)yP)XBbpy~87nm$dRRs=)}eIlMRnh2%5 zK2>}4soJGaRnw;d{8Rt)*+4rhrs_wd80qpxedrS-=u_dbYUmRq=u_}&`PCjkB~4eW zL7xorGJV1(^!O)iMz?<=oHCZ8S4I7wbfr|Ev-R&kBe`@1`^ag1T( ziU{HJ*f>VIqKH9k93!1bBVXzPRMNB*Xu7nFrccXh(VrfDA|&qBryfujyJ))LX2uC!we5^ojiwFg6ZjG{Fsad`n1K zK4vhQ7JC4dG%W_2PA{X0*ud;Ayhlbih#&$^v^V%U$KD|9mz`+MPbnWn_I| z*-D?~qH~`Kj__O$ppvF@fhH>P#3`M1S{c^qF14(aQ_DKt$vPGKM5tm6Bvdihmip8K z>TDNHXFN@on+~~~+u2y4$@15m-Bdf<9wwE?YCNAYG9ISii54>QNIRPdG%fZ3Drs5_ zG@V{X)6PH>5s=Yj5fL;!{EO&Q+@nu%mp;X&PnMgmQ`vMR&}8}Rq)Mz?15G&^1_g|a z2AW!EAtUJAwm{R>9zZ2cSL2{h2D!6Ntw7V}KvS+3nzsBR`qTsJN*7I+Jxw8}9c*X! z2bwIW9aKf=zCcsRX&JdU&=hjoJKEXCK+{qWppvGgK+~mVG&KTEn*vRD2b%7Ircm;9 zMa}i50JJFGT<8IHv5Te)o~ApMAKd9`mYtfpaT;;1&oWpO=({v>m+S9%td$zM#jUWK zt1L@?t_M&_)44#?`CghlMV=l{4YZ&yh5+G~fh7<#J)($XAkOrFINL?b8Bfc@!s-z> z+|G)rHfUsnTWxu&S5A#gsn!Y@n|`N8cB(>)r!qi`J%CDD76UD(dueIy_SCeV^z^j$ zc#2x=@?2AErJQ3xi;~UzQI8%)9X&c~YP3bjZE?3+Qfl1EHIlpAEO9lGHf!Vox2EH$ zS{m8xZnp&3NV?hsrzB}#&?19-trkrNiq-{+c0du{$M6^ot3)x!C?Y^JNSAvcUFo9e z%SO>X!tD-MZD++ycWdMxSGOe9DB7fvyH$(@ip}28NFx+u4bIeIqz*!CGp!_O$`f>H z89|mJk+zZ|nW_7HAPAMxcB~OZ`f9+7sH{ktM!Hu>fYN+Y%cLZBq|9Ll!pxSt0?Be& z0x@#iQn1Nc4MHJ#g}k|IA#5lhxDoHbIEfCCX1K~j+P_Zx?NL&p<5wVci8nc?$ zLReEkXqFJjQVoJ-tw69W76@du<+4`;gkoXHVg+H@TBNz{8;M0x^UH+it(){`h5oG4 zpOx-QYF4{FYKGjCYKGlzH8;B*YIeAFYVaXyCS6NS%WYCqb)Q#Lack8Kx~3Y?Fk4^P zNn7M%(IKPh9?ws;v&V;`y5BZN9@#!VpC|!#nDn2phz>)3QSH6s$(w31+85N~#@UCPJszqv1zeTkad_Pi)9r;i#(eDRpiGJT#yBYe`66wFEHiv$-SkkL% zDeS+a7H@GyEz#K9YVjhM)#4Fb*r9GV>xM_a6-gdjZ*k@mzz&s?xoOYt3t)n0bF{z!apa&ST zLOWeSub*D#4;at`1m^&TxoUDXaRXf4?{=Yst*cp}B>g>SkY_NH0qHY0roDtXhBk4%eWiFk zO0QOm9w$?f>A=U=0w2!@KE4t7cs20x-N4890v~@C_;@bx@wLFm^MQ|V1U_CJl#>8X za2oFpdOp5Z_k4VB(DU)UT(I%+4ddg_#K)h+40%Rg)TQU-o4WL@yr4_Z%QtlCnR#B9 zo|~`f(zElNEC*G{U0r&pQyie7&Me z&)2tg>G^tDmmR+TRNW3=FR9z%>s#t}__{<_=jj&t+p5R_Rq|w^&6zwbfjTjiEhaA7 zkTj?jKDJv|P50>TW36g3l}s_!yV22nVh;!E?1&z>`?D%!K050jBk0^SWG_dq($1p? zB0JH?gB;wu=D}2B_F&9|b@v#+v&Y;QcMYYS1LPo}tLAV0{iUe6iJLv0NA={R?g_;j zEQsP%7d89b7nl#kG;MRB?kt8}tWN+W$|;p0Q~7z~V7v+}&>$7S3WMhq9An4*lSKMh z#r!OTedQp*GNv&~{r}L3i!c zpFHa?>HOt-{!(rWP5z~RVibRAhs*=~?b%yA0A8ibr!as=DZRv+HUoH*a=^+3c#?9! z4vFGL!a$lY)!XZ%m3TeQ!v6{txd>`uPAuPT2p)!v24;&ZtNE|M>B5JvCI} z0@aW5Z{e%+D`%JF2D5(7(dV3Yp3W$dH=~Q!YQxK@50A^{PD+qyXkOQbJ4*p zI-K8i>|`Dv|hrYMi+z=xC()>3p?KTX7uu$7?6~9Vhe3v3B0{&>kPw zjp0_zofsG{QjH-7iMSOt5+Z=1q|Rh%uE^)EV+$|=Fo)+||1r@?pke)E&-PNmoq7tk zq*PrP$FBMm@W3~AwI_~c$uRhG>9~MDghN?eIpyMNfpEp=Q}Ka3ZT5e zOivB-F$3}JnpU3{0eEy8S-cAp(tLGJ5(En}`!pgM_C#yhTCq{5$SHEMve(!Vx%BHZ z2?a9<5=bS`pyWErV$Gtk0;kX4U~$KrNU%DbyQ&Qd2Pmi7ukbroEp zPbDZRf@qi2*Gz#>F|R<(DFuqPm@uQ%fUN4*lejvT^aEWQ&;wCXFzeQj!~&!NgK7G) z9+0y}Dy2b#+}|MRCtUZaB(@9{|B^NR61ZBPoRz>X- z!x>V69WzvqN#3i4_U%FCV-%<`f}d;y;tn5WA~7fl3m}atRHzhDu{-9I;%hsT5itQX1azg`2V_zq z!?lpHGGb?`g-jff!Mv4tpqubrxS9DxR7^{SphMK6VtLFKfc{DF>j+u?GjBT4xsJG1 zb2x0;R=Y;xkfB22WMO8tp}%f3ixQ84;o>T|S4?GLlBv{{COI*a%->*= z(`!sJ&tBIgCo;(?4g(=dJ0=;U*lm(w(sfL-46^El%>C)+IO#UWsT9_T=T8v%Lhe~6 zP3FyUV%lUH)#am};LE%BIxcJXP(NO$#+v?!(^v>h^W>D=%BfvLeXMMAA*(z#)R%w2 z8wlaz;tR)!4Ag@_9v6o{q-TFbGjb={+fCIx%HI!gaFlWW5uH{9oAj!l)7OD)uvf_b z)q%Y@dF*7jSTGxUm*gucKiIfAGZQPj60A}h(F)n+7V(5PEHYIh-OHk+jpvbB??4n= z^olD4+v^hWx)j?Bj?{K#JwNlRQ4Nn^g{$lt)<=vQG~-&&U*R(UnDTdIwAyHXT7$-> zMLmgkjPm#7KxJr+N9w#AI%>;1AFA`Sa7S(V*y111`5@d;TRwJLcRmVt)RvE((Vdt0 zBcN)_$Ihzra=4?meC(V$uY@~l%g4^E^J=)GwtVch?mHLM(TIS)(cQVIjz)Cn&F;>U zIvUZPpLBOFsiP6yd8@l~Ssjh&&QH5LSJcsn?!4XIxvGvvbmyJ!&U@-;M0eg-=iSgz zTi*Flou7p}YRktK37hi|!X35cW2bfJqi{!U`PdoVd5J#)s|J+k(*3+&nrX04EIq8t(eU!4Of(}RP=#8{1!LST;LVfQwKU^BI3hs z^Pb$te!QU6PiDpDydDnNBpHp4IT6~f@`NlVmwg2A!B!?ySW7^Fu3U4lk;)Jhm>3y` zy2W=b;T}(Z3J4vKn`7@IgPz! zO~1#BpegADP2HiAs7@BLBxEIB;aVUsmJ>5Pv?m&7ws6V7DfBll$2Rb zSzunLZd2*xvz1THXCb+xEb%qULfFFtDw^~K$x*;p)Nfox$`beFvwfy4AP$KV%1W+E z(DFn!fei>`S0YO-K~b=R+)&1833NB8u0+-n4;D-6lICmJO%g{{pS3-pfUYk%Uf)=N>$JvwDC#G>e{6^VCyY%1H2%ybd!!+t_ylx6!I3n>9E1(58 z%UXDnBDQCe`oCI{-l}@&cle2s=HaY=edI+Oj^0AisO-ctn3Om_rkDs6@F`^$r_RONYeUuR&=-o^WEmiLzK_9IpGlHN8225h+6|G^SS{X3txON}4#T-vY5zpQ3*6tk!(^K;8ARHgd zaltF?Emq@ZE|`wOt{_qYN~SCtsHlWk0|B->(JDm?f=(^h!0yXZ4~FV zL}1n3t|NOMn0!^E8D`;x4y6m$vNfP}U2V{_M!UssaVs_0DaUszIFxEOpr2}43xxw> zOE-nL?`zc!u8#5uV#N&#Nsc?U)*7O9k6wM)4Gm{?;f5~POY)HvH}C}0lh^OYaL_vp zg!rT?hD>#m85^ABu!K928P^e>G#GGBQ^}4?=0G$R0;;rtWW^lwz+>=XfQXMeVrPEX zB0_j$6>N z{ti3edR-&hwMRVq1aHq!ZTWpwxlrpp)QnSmDAhxQ`2h>SRoUg1Fm?!3y#e*Sz}ibB zUu?JPT^c5ukP@gI+AW-2eUHhAP|=q^ibS(pE$|bAYHmn3IMZ7Z(JMp)c4fCJ4Q_=| zk1Xq*hMr5?9=!$q{*7C47%nxaI=F^bnxEMLAD*f-cW{FOLDe<#_)9sc)2IsI`VfO! ztJ0{|5uuwTbc`TFsk}JaStT!!dP;`;)$RMTir0inp{U5I)?I3oSknubgGgIqL}8zyq3Xi6GXyFY2QVO*d}Qgol8Y$1)VE}h|1PlN0P|VM2@MXP}xl* ztoWkQIM@ms0ni5;8&0oahp_dGKMAB_m(VtYvPfdaA_$Dtd{pY)=6A1Y;+h{Q_J)$ zkt~0)^i>%q{`l;ppQzUM5_uy(9hN%(;Pg_I-ewudkJ!rQB1dI>w1!I%!y}ZV*8Hr| z$j7fl^&DbHDH&|RUW~d$&r!af5RN}Vt|Q`J`s>QRi#H~#CpfPOHxye9hN#NUDiNi0 zT(GV%E%4!1_{XAR6esoDpHMNMxG>)RS!8wgE3w(M@KYz0-L!O4pw!VUves&TIE31cnV#Yv?-0f5z2 zJvx0nx~hXt>t=zu#lVyhNTb(h_>4dbOEfEL1c^w5mFj{t%*w*S4atVAPYwecwIR9R z-i8l))k-lUPHzU{ZV}W*AdVMC>}AhGx??5uPne+2L3x8Z$&+a};gIN^J z<$p5}4-!E8fIK1~Pq0Yc|4IABT!F}t)H>wKAW%f`SN)k(t#1~?l980fx~r4|VGwJW zx_O6ZoGJ`?18J+MD)^D5d91UPlmp&o&-9>0RF?X%h60TC_L~|m2h5I{0AmA{4PFD- zl3g}ASW^lJ9*ce*#FSCQPJI$8-n90j!b-qwi35T_P;RIYlK|NG(a%Tu+~s^U;hb%W z3dUfE3pb36MVdI!Yx!cZTLe7XJ%l-|1pY=&1pN#+)MPhoC2AfAouIg39KzaM2L~0< zIG^81xuia$Ju$u zC>GKs1v$p*rWDm>)};~TMmlE!E>r{KqHtsJKarxU?Q7*kdk^??se>lY?1O?wKUzo(Y;JfxC9k1XdM?WGFrGhzh}Wuxa_ON#u7; zbl$-4nh*nqT@x*+!hnd}kMDYlT@xnLu1N*96IFE;g6%|;j>|F1i6+F6V9y)@lH~wo zVTSS7S0Ax8ik{=L3~Z_!s*-kO319?1nd{ust zM(HDK4hW)`BT9%&1GHW#f}2L(?g`V?1e)j_@pi+56NnZ@Iw)p7FWMiE%a&bLw zWWEVYSg)4NwAz!kCaXYd2>mFj@>Nbc1wPbNgpn$OrWpkO14@dtPMmKf$p*&n@$-`_ z_pvT3tV#hnnLzI&caUeH&@t)JZa|tv%f>?v+6WPjf*tm|x&@~dPx>c3mqoejGZyo_ z3L&E1rd4*uH>Ikk$mm(xfyaE8x`O{+2Z_ii_j+Zns?yq+^`#E0a|k~7Y2Y^MtSjTT zB(uZqA|meMwjHjs$H62N2p==l{Pe<9m6SAh;Se=9Kl%^B%L=S?-VR7A>G-%b~feeM}kzvOVNWoW|t&pQe96F9#Yzb~! zHW4bcQy2-uZXd6SZ@^RYwmkJUQ$Xi(Ppz2?Pi;Q8$5Uf0jHWJhmd{}Rx#Ovs>k~GL zuQOM%QLOOAydQCq_kJn{nfGI_l^vbn{cyd7_ls}P`~9MRkK7pEkt|&6_rxBZr;TsW z?@`yjj^DE+9I=(Tii<5qvu9E1_Yf8N7q~B{2A8lsAR!M{_&r3$KcZKSkDq*Gpxd`8 z{<+4t{k$Us_3zc<0Tm8MyhBQ@ga<~*ZTdh&MQbN%_2MF%YRbq#$#I8<>Xw>jaw@n7 zRHWZbq2dlqqf{m{i(^r=b`$z{4`-aUU^V;(s!GE$rz$L{S%u6OCr_{|*G;7NH<~o8OisYFCY84MIj}Nb)5S$hgIWMzLyuESHS79kp%s&TR*Gmd&k_=`S?5%8bm-8E+tG;Kg}PN;-O*5Jx;w z5nYa{vMP>-C>&v3aVpf$aWEK2f-mhs;F65*;;orlq|ljL!*FoD9^(vCVLn?7#(@0H z?*~f{)co9aJIj~SZ+n|#_Dg9{o8WN01yp9G1!N^67SOz?Q4|7kVu zJC)x@4e2fPPiw)p@Ug5qtW8o1Pp$rhb>W*9RiKe9bCR>Xn6U|919v^lekUbDVfc}SIuWL$cl^D`kl0K}GT9tBU=O#`eA z2*!msFA&6lEJF}yCq2BdrVFCS-ZaTWG)WX| zSy5#Xf!(Z4{dXkI$rP;l>BqmdoAkNKrT_4P_6hsQ0i)r+OsSEx=}185KXKa5mZ%Vd zwjuox$3A&nWa+Md7YTBRJk()FC4{*(N)*~VR*ivLqK>_2hh2NAi6R2clvn1TnAgSO z{JV?&Pt6Zi<%QKJ!f8Gs(@)R^myXTn{-YEf=gja8;Q)#4lH-HzTnWQXJ7}&z$4sUH zRl)SS(u&7=34W*}tA z6sfqHjs^v@=K<;=QcJ9qu2?UFX3AXsaSPOc+-hJ_&|I^1+7vU~lq*#EukQ#EPT%a| zAG^js$_CxwE3W^?uI?{??{{$>oE+u5Ej`YsY$Vv60AUD+2~vO-%kcALS(8{r{EPxG zbjMI<9IU;m&HCXOTj742MWDwVXr+IE&&;M zMm<1Zf;fK6M`v0{i+wk={ zyTVxzaQ(A~{nUsr`@Z~&gG>1XejZA?F>w5So6@#pofeS(5Vuxja{-24{HCi@ntqH3b4e zeOtC9%x7kWKbnq)>GYT{2^cdt(`w;V{)(SFeT+GZgBXB5BhV-!Y7Si7b{Oo@0<$U#{LFKgu~Ulnq+Oub^ka1hDzaaLrEH`}x3u zP&UQi%9mC1x5c(iT2L*A9VdOqv`_PR-fWQaCq8A-now!jm^LR;m#^__Dpj||57`%M z=hqC8DMA)Dq9Sl&oE1fk@j_wEtBlNl&HvA9SPmXmU+q`iFn@Kfn9- z_x|$ymFUHt|L>1J{L4Rj^&kJY|K!vQS-f-8X>Jdn{@&{}51xMgTOPd|dqW1|#@ z>c-w^-0&O7!41OD4~*RyRyxIaV{h<-WgMH4CEF;qR@0O)Zqyf!`I2O5V=K+y@)ybt z7IARYuiiv=gZaL|rRjE*^8>wByydxbjQ06MvHZBMtNF__TvqMUp&O@h=()_pqUwyQ zyVXypN%fSS&P86T>!V}}J&|@3quH?{DJ4Hjz?by?SW(3vE5aaq=K=?G`m5WyB!zR~ ze6>i3h$u`8RZ5iltK3RBi*w;^lu%L^sV0%~2ma_dsCgNksW19EUKWlOan+Dg@L3A) zGzZOo5UpcI^wmF(gPO6}+KRCcQf-RNE~e(14LtJk$EQyHCSGgs@9^R3Jb}WnTIqyf3SVn3(P8cUsJV%~_ z*|0CIV?GEVNK)yblLf%@6qn$rD=YGcCTfmah{GNr7i>;pRg3%p)5M~|l@O=1hRgsE z*ir^af1>4A`dSoo^%;{4wSB^*azT>=M$E?Q zu#RxA3j{8O88|D3Z!NyFrh*!3xjy!0MVrdf5SA9(Un!g>QjLR+w1ad8-KX5r40aO& zGA6E8fX5jnQ~p0r?o_6Xu~x0skz?X(?0aq+Du2|N^{2{U0g;kUhsCyQ)AzdT)5gtX z2q>>K+s)6=^vid`6)_aalgd%?$0?Xr={qF$ZDQ@)C_R9QK!_Jq%91uosX|)DF$jE; zXGl%wX9XW_pl(XK*cQ+|Yis<~Ax!wpoZ1&ez*Ua$!uhAay%gp5b+(RdBEi)hgviC) za_X!NXoQ7?9AD6vtbZ@1Y%ivP{h}RzRRvVU;*Q01y~(bJVrPC{#H4;T%O|SB=iK^Q zn*4!e%@YF-strODg+RXu=mut>_?(+sL8j89LX`-uWoktP3KK97s`qL87zz}d68)Q6 z1Ko-+EQ|mBluUxEk`3a=4{Q(_qmlZe8|aVC{E3bbTrjIQa7I2BK~wOpO7YVyD#bu;=UWxKU4J); zQV&UDb)%a z?`_B~?XyAM-KK8XHPbt}Y{kO-2Rq=Gln({yMwnyOAOng^0lX2HC-ux`VDOI(Q!PlA0kc(R2{@*7AVCIb2oT)(lJ*tVapLXVdioPy!Z|R&p z$W-zHtPf@lZ?1LF1B+Ronis$GIw#3LhCBT1;}LyWyO96$f4mg6w?xr{5tvXf!7b=V zA!iT!=axNTy9?N-oge>;f4${bU0+K_W;osdI^h2INXN_db%%Cx!Gb`Oab_(crk^;o z9DAA%erfp(=`tMs(!t#Vgi7{E9PG{Cd}RrtC>W66LtU>qMAvHiZzKsW<~x94^>m0x zpKi$FD%vA1W#M#H+t>9K7hfh^^A#7~bop_6lT%h5W)rR3`Bs3WQdA2jEVz>CRXLi> z)J1KDVG&;hq%0WzTz)O)-iP7SgJjCk)9ydGfm7#m5|0xC=ADjxL~=cx5)NLl7%voY zae`h6K3rB_$}8xlR0)YT165Pi2?>_BtN*iLqxgbA$)W0)St=K4u`haI#+A2G9On`x z)Jk%cyxK1-^P}%DzG=YIi188i`I&QqcJ*Dwt~PLIeLH{ecbD|chIX@|k7zjiPOeBH z#9SyzPrAlRbsh~%&h?2dC|I6ur2su8)B9vXgFWK8gHg)G%B~+)%lS6KHo3XWt>zxfSMU&KYjAZo3&9UzQ1Dzv zr1S&crr1Tq2+w7 zk7F(02|lz?b$KwB3XL~?Hw{85KSj~yt_sDLqDuvfzW>-O{X|8#X!`~f9Xf-e+oxSp za8ZFIcC^yGc;dD4O3aTc5Nw4L4QLT>Nb#VL5N=gPI%XUBrYy2>^7KfmckQg5e?iaL zi37b=#nk&AFK7j2gAmlxlP@c5lj^_~SNtNR9q&*gSU#`BL|p9r)T!s9?|W;dkN4$l z!zT6r7RRwDyBb+MAoY^5La8ls^iIV{wdjfGET%y3KiAIfN0KV}Slj=y0R?A1O@WcT zF20UquXNSm>QUNv@K|P0D?3wtu~o^>eOES6rywZa+)wj?4Sd5@@CC_}4E)RnzF_lg zU>;{z{BMouGbv5}mM%x^a*CqJ28O6XU;TST$x~7NY~mM=Ttv|hn?(6#B|iEC!!5Lo zWLT4_{Oqe?44-J7o!{k@3YAlN-uzYW+8_U#Khs#{xTHQtHFoJ^AZ0*cu=snTOBDL6 zX8x83nE5Eux~PL}IsCG2{?qVCS~-RTGLr10@1`STEozELyH8nMett31}&ZTZp{J!f1=k z?AsT4%}OZ$VM_2uAZKH-4i`EFMdmu||1!uhsSrDXLervTYJN4^dwtLo%ptev){ zb)oZ)+63}HxG7%;#qh|!1NMon*-9V#>+q-Ie)E8MKg-A25wJ`1bA|Eb2(ywHVP>T( zp~_EIn%3km{YMDVNb^^z$G!VIT&~YQ_=mn8hcK82`Jrer5`t-v-9Jpx$Jl4ZCQ!8a ztJn7vVB|Usr9~Txp|Ruk3~>Sncuy(8Z@S8#V`^+={2f9$ZGB=GSX4ZnstzK=atU+X za^ajW>nz8h9EOzz&d5lKGb|RH4buYWe2stgQ zwD{tR&_p_jG=zGAuwEh>`@VcJO0h`Ykz~)f)B=7hN@1C5l^>HV@@sPZN^L$ekDmQ& z`W3$4AGVBCSr|OYE1Wk}W~P}?;{3ZI;a+5qi(JUQ?vL{eT;?P?nwRH@LLwy-sXCOy z|G^C-Gx4{Ei}QW}{~aq-S8=fccOqTu+rIj|KNBmpvyvG?@>ye_0tyt1AL{c*K6t?r zTLf1LY_*xM)tZC3<*@i_9e%R!0cAlfaTae`A)m`iv2E!NM#&VfMoNCVLO%6%B%r5>KLVh@ii|E(}_DqtNq#KgZAuq(gsiMt-KK%9a78v*t* z4o{rC5n#Vs`gY4MeN9ybE*-T}63OCs#gsTq32zxw+D|&!5mYTsQ|oD)RKMm|$Coc9 z1_-wagl1HjSIi(6te~psJ3d7xF_kzV>LDHNo_SZ4OmV11#++lz{sI7L^JYnH+N{>~ zL4`llMRx_&Tr(bsErzZ*|5E=d2pVb9I>g53qrR%ms;8U?0q3StR@q{BsuLmTofk82 zAMFuzN8wjg|GI(!#i&+XkRYOY$|4xU+lAu*!Qmrn6%aC|;AcI*ua%Rp)5I%@If`B4 zFDklFwec-gpz~ND*YIL_1X1V9hT^qQi61JCvZ(?fqPmVL*6WkzW?TeDT8<%2A}rNw zv}|U`XbuQtqG+7d*ExjoD^dONaxqQSD4+QEQmgaWW{E;gsUPU;=q%Ifpq>J2(?_pG z`@GvA#E^LuR2(EopCQs?=i+S|`{;!`{Z`{B?z~&vVO>4nV4tkl2i(v^hylMVT;HZe z6~~ECuvVbcYv*vwwyPkMDm%y8*2lDJOhMh3NvNSBjD91+XT4_c6t~Of+Qui<&dmT~ zaSK)wFxZd(_~o-Hn6SgZpZB=cLOPE>Xf#DwWZ|DTImUI;f(-TCvAk+M?l!+>=M3ZK zhS1(qzwgsALlQf1M*X_79+B2VKik%z`2kUt%!oLVzx(|qq$GcfF>!dTe5JJVs&m`( zNe~Cjez+1xC!_jCUUIe(&`MaA#H#r;a#buMi=q7;Eyg`OnRA0EE0SdB(u(#vkt%uh zCGEP<)iRryD>_BR8mk6ic~^Mom`sbLwMFYhp{0%H*bs1n^WuR@@jzM2k_OZfiEc0k zq`w!)^&YAI{6}v3`H$S(`v}B#a4}3Oy${^kdBASRy|?c`Uf={=wTP?N;?x_w>=aa{ z&C&X;*0CfBDZnC=`=(L-c1#flH-w~-H@Fc7x8BqXiL5qH>(NzF{v%3re95*%Bc)!! zBYEFie^TTyy73xHzpRdAo~- z$=meC&JX_LKmGH6`=9@pfALq=`{57%*Oxy&`(OOi4+&(Voqu-bM`wQUC;#NNC+lfM zRi1yuv-Lk*lSUZTrKtW;%q0E%tMD)3pZZ0chCYpr>lxkG|EaA;`6W&A2aV(N`?t&< zdV2Hx@hJL2)QkqXdl&yk`8R$1_{{vmp}8aOndw8bGY1}U`!>wZJhR{)ddSTmI{56u z#(jg%X@oob?jQ7nx_-bNU@p`?`d!)v?SDcmtPac^UpRDR+Gd?Ta=;y*J2Ah1#vPwM zw14Kfdv^Ndj5~1XnP+C^XO1i|^^t=M&mO-nVH|RdH%%l zg%d}&EX>W#?tgar(2?U?jxS6KhMGG=Vo|y`sl%# zBfM?%9yoF2;LO|+jT(ESqj59Jnd_VU8{%Kl|Eb8i3iEa*%x z%(#VTXWabEbF9pPnR)m8p@nDNG|PMP(DAu>H}{PDyEF51%aQuqTvYJ~oliX}9l7b4Oi;GEwO#!b6Dpn* z^REr_EhqE_c#lS5U5^~xdvxy55oy)wYBPEg7~kOE!~BzVFD$%dRWjQ>R;T|r3BSMQ z;mc-FFx4^V`VZ>=-kSZTImyDI0}i#Cn?EkoU?d|g1*BgAlDJy*f1T^w`1kesLkOB) zcy|8Kk;A&0cC*v-2Qeds#xAG)Z%)Ln^#=WY%dE!i-0>6hGw#rllXHi`bbe<4iTUG) zPR`6?NamfK-2B|PxiLM9Nj~sx`QK{|%P;Cpqv#^=H!;Vb(aM|tKeY1W*YIFJJeu1w zKXVX!J^yWULkBUtC!XHCf9|fboAaNG<+)aY+UzX_a6{HyZs2yVuixUvvOMUkzNTxrPycjEYrjQjKvH}`ZK`vp4| zXn6GbXAkXv);&LWV)g*OecIkVapd^)Gcz#i(DZSX0hT&V=e1FM(?4nAF#p!^Pg<(~ z6a9Da?*^<=2zHJy9N2Pn`pBXEhXH7WJ~+@cx%)AbD*7qgl-? zM-Ci+z`V7<1KmB%EqQPMAR|%q=%B)7A~;&X3<#RCJoDVbmLn&gGhUwNzHs?E|5o#F z-g4*t&>}KjE;VN49U>KDvF|_Ob2Tw~ue1*gm;^$N0$j*74EtZR2C(+sDVpC&nkocT9{-Y@HaL z*fudXv3+8EVq#))V#nmj(Z_-~+-?PvKW}|TjXWTOw33FlMzmIa=1?H*o{C`br@}!VBEP&a~ z<8FGvugnbVrB3u-fc;mrL($y8(fPRpC-xI0C;bYNPfQ=2i7Q`~IyJaOgpI;(divXG zRVudsj;))=#y5|+4I^V?lapxSHpdc-Y#N!|G&;7i_B_Vx#PQn5=B<;PM;Zi1&uw}d OVu)}V8{IrU`Tql&j@>5! literal 0 HcmV?d00001 diff --git a/docs/bootstrap.js b/docs/bootstrap.js index 2a48f55..a792eb6 100644 --- a/docs/bootstrap.js +++ b/docs/bootstrap.js @@ -168,7 +168,7 @@ /******/ promises.push(installedWasmModuleData); /******/ else { /******/ var importObject = wasmImportObjects[wasmModuleId](); -/******/ var req = fetch(__webpack_require__.p + "" + {"../pkg/mapgen_demo_bg.wasm":"e746eb2fb67992eff455"}[wasmModuleId] + ".module.wasm"); +/******/ var req = fetch(__webpack_require__.p + "" + {"../pkg/mapgen_demo_bg.wasm":"bf853f7fb17b7aed38db"}[wasmModuleId] + ".module.wasm"); /******/ var promise; /******/ if(importObject instanceof Promise && typeof WebAssembly.compileStreaming === 'function') { /******/ promise = Promise.all([WebAssembly.compileStreaming(req), importObject]).then(function(items) { diff --git a/docs/e746eb2fb67992eff455.module.wasm b/docs/e746eb2fb67992eff455.module.wasm deleted file mode 100644 index 9daeebef6bd30c032530c64e72ec7ea42cee1b68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40976 zcmeIbeUP11p5OPp+Q^VHLHQv*Fue6G}P=4kI?0NdX(~258yQo z`Wn9#f2ZPageQ15c`Xe2DgcwkxN`HxO)pIz+CO!0_r9r@W_Lfoe`D*&>fO6ve*VD0 zeQKS3zBRRXe)qn)*+aYMre28B>pgI%9@xKo|J3|954<$Bd&~C8ef#!}ZQeUJJidMJ z$XImi^&T4X4;`F(d3g8a*2xz}N4E`cof_M^ZS%hJGQquVOg_)vWBz11|1R@C~KhJ0aRF{<}`yHh9CaU$gcn7t55CRx%0`d>{$E66A%BT?>uIn8^R51W{Cml_|L`v-Pam(o_N6FatWRg@+Q`N0l1f%n5oJ9yStURI)yhON zksNoGCn^(p+^pu&KwNi~JZ?OjRi7A)U8Uaabx|ITCKRqZnnctpt?VnV*REZqai72M ze6f;lwb7(O(KDJ1xLSU^l|7Xw&s8Q|lAlRh&7A;xJO!>HqT651lcxqDulYnWk)CTV(pR&uz0+sps#hqdPV{7=q*|98{oeffX$zn=J4J
`Pyglj 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