there is a map
This commit is contained in:
parent
13aa62ecbc
commit
d5aea97931
8 changed files with 227 additions and 74 deletions
85
Cargo.lock
generated
85
Cargo.lock
generated
|
@ -2354,6 +2354,16 @@ dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "matrixmultiply"
|
||||||
|
version = "0.3.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
"rawpointer",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "maybe-rayon"
|
name = "maybe-rayon"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
|
@ -2460,6 +2470,33 @@ dependencies = [
|
||||||
"unicode-xid",
|
"unicode-xid",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nalgebra"
|
||||||
|
version = "0.33.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "26aecdf64b707efd1310e3544d709c5c0ac61c13756046aaaba41be5c4f66a3b"
|
||||||
|
dependencies = [
|
||||||
|
"approx",
|
||||||
|
"matrixmultiply",
|
||||||
|
"num-complex",
|
||||||
|
"num-rational",
|
||||||
|
"num-traits",
|
||||||
|
"simba",
|
||||||
|
"typenum",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nalgebra-glm"
|
||||||
|
version = "0.19.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e441f43bccdf40cb6bd4294321e6983c5bc7b9886112d19fd4c9813976b117e4"
|
||||||
|
dependencies = [
|
||||||
|
"approx",
|
||||||
|
"nalgebra",
|
||||||
|
"num-traits",
|
||||||
|
"simba",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "native-tls"
|
name = "native-tls"
|
||||||
version = "0.2.12"
|
version = "0.2.12"
|
||||||
|
@ -2577,6 +2614,15 @@ dependencies = [
|
||||||
"num-traits",
|
"num-traits",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num-complex"
|
||||||
|
version = "0.4.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
|
||||||
|
dependencies = [
|
||||||
|
"num-traits",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num-conv"
|
name = "num-conv"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
@ -3267,6 +3313,12 @@ version = "0.6.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539"
|
checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rawpointer"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rayon"
|
name = "rayon"
|
||||||
version = "1.10.0"
|
version = "1.10.0"
|
||||||
|
@ -3497,6 +3549,15 @@ version = "1.0.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
|
checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "safe_arch"
|
||||||
|
version = "0.7.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323"
|
||||||
|
dependencies = [
|
||||||
|
"bytemuck",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "same-file"
|
name = "same-file"
|
||||||
version = "1.0.6"
|
version = "1.0.6"
|
||||||
|
@ -3668,6 +3729,19 @@ dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "simba"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b3a386a501cd104797982c15ae17aafe8b9261315b5d07e3ec803f2ea26be0fa"
|
||||||
|
dependencies = [
|
||||||
|
"approx",
|
||||||
|
"num-complex",
|
||||||
|
"num-traits",
|
||||||
|
"paste",
|
||||||
|
"wide",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "simd-adler32"
|
name = "simd-adler32"
|
||||||
version = "0.3.7"
|
version = "0.3.7"
|
||||||
|
@ -4721,6 +4795,16 @@ dependencies = [
|
||||||
"web-sys",
|
"web-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wide"
|
||||||
|
version = "0.7.32"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "41b5576b9a81633f3e8df296ce0063042a73507636cbe956c61133dd7034ab22"
|
||||||
|
dependencies = [
|
||||||
|
"bytemuck",
|
||||||
|
"safe_arch",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winapi"
|
name = "winapi"
|
||||||
version = "0.3.9"
|
version = "0.3.9"
|
||||||
|
@ -5114,6 +5198,7 @@ dependencies = [
|
||||||
"ehttp",
|
"ehttp",
|
||||||
"glow",
|
"glow",
|
||||||
"image",
|
"image",
|
||||||
|
"nalgebra-glm",
|
||||||
"poll-promise",
|
"poll-promise",
|
||||||
"tracing",
|
"tracing",
|
||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
|
|
|
@ -14,6 +14,7 @@ poll-promise = "0.3"
|
||||||
ehttp = "0.5"
|
ehttp = "0.5"
|
||||||
image = "0.25"
|
image = "0.25"
|
||||||
bytemuck = "1.22"
|
bytemuck = "1.22"
|
||||||
|
nalgebra-glm = "0.19"
|
||||||
|
|
||||||
[target.'cfg(target_arch = "wasm32")'.dependencies]
|
[target.'cfg(target_arch = "wasm32")'.dependencies]
|
||||||
tracing-web = "0.1"
|
tracing-web = "0.1"
|
||||||
|
|
6
crates/client/dist/index.html
vendored
6
crates/client/dist/index.html
vendored
|
@ -94,7 +94,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<link rel="modulepreload" href="/wxbox-client-b2e1a3e7de3c6850.js" crossorigin="anonymous" integrity="sha384-nDqexAJ4zOC1UgJKvlu7tZO/Xu13qGp8nhmNPBCjCZhoWJ2FIphBbxmj+dwXs9Uw"><link rel="preload" href="/wxbox-client-b2e1a3e7de3c6850_bg.wasm" crossorigin="anonymous" integrity="sha384-Qv6lJAdZwj0oPiGat7p3dWQwZr1TtBEsq1J/pIPFPRI4IcAQ2r5ulP2rCVt+eFeN" as="fetch" type="application/wasm"></head>
|
<link rel="modulepreload" href="/wxbox-client-f7fb5fe8b7aea995.js" crossorigin="anonymous" integrity="sha384-wkhAe67T8C73+DmlG8JEq34RPAIiO8Jf+d3BH/nrBQ1b1NjMqo8csITaVtpbPBwV"><link rel="preload" href="/wxbox-client-f7fb5fe8b7aea995_bg.wasm" crossorigin="anonymous" integrity="sha384-S4pqZqxf4w0VeQcOCwl5kVOUPKF32nnmgmF2zfXPZumbEf5Gr524gAl4j0hlT2/K" as="fetch" type="application/wasm"></head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<!-- The WASM code will resize the canvas dynamically -->
|
<!-- The WASM code will resize the canvas dynamically -->
|
||||||
|
@ -111,8 +111,8 @@
|
||||||
|
|
||||||
|
|
||||||
<script type="module">
|
<script type="module">
|
||||||
import init, * as bindings from '/wxbox-client-b2e1a3e7de3c6850.js';
|
import init, * as bindings from '/wxbox-client-f7fb5fe8b7aea995.js';
|
||||||
const wasm = await init({ module_or_path: '/wxbox-client-b2e1a3e7de3c6850_bg.wasm' });
|
const wasm = await init({ module_or_path: '/wxbox-client-f7fb5fe8b7aea995_bg.wasm' });
|
||||||
|
|
||||||
|
|
||||||
window.wasmBindings = bindings;
|
window.wasmBindings = bindings;
|
||||||
|
|
|
@ -102,6 +102,20 @@ function getDataViewMemory0() {
|
||||||
return cachedDataViewMemory0;
|
return cachedDataViewMemory0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let cachedFloat32ArrayMemory0 = null;
|
||||||
|
|
||||||
|
function getFloat32ArrayMemory0() {
|
||||||
|
if (cachedFloat32ArrayMemory0 === null || cachedFloat32ArrayMemory0.byteLength === 0) {
|
||||||
|
cachedFloat32ArrayMemory0 = new Float32Array(wasm.memory.buffer);
|
||||||
|
}
|
||||||
|
return cachedFloat32ArrayMemory0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getArrayF32FromWasm0(ptr, len) {
|
||||||
|
ptr = ptr >>> 0;
|
||||||
|
return getFloat32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len);
|
||||||
|
}
|
||||||
|
|
||||||
const CLOSURE_DTORS = (typeof FinalizationRegistry === 'undefined')
|
const CLOSURE_DTORS = (typeof FinalizationRegistry === 'undefined')
|
||||||
? { register: () => {}, unregister: () => {} }
|
? { register: () => {}, unregister: () => {} }
|
||||||
: new FinalizationRegistry(state => {
|
: new FinalizationRegistry(state => {
|
||||||
|
@ -198,7 +212,7 @@ function debugString(val) {
|
||||||
return className;
|
return className;
|
||||||
}
|
}
|
||||||
function __wbg_adapter_32(arg0, arg1, arg2) {
|
function __wbg_adapter_32(arg0, arg1, arg2) {
|
||||||
wasm.closure1003_externref_shim(arg0, arg1, arg2);
|
wasm.closure1007_externref_shim(arg0, arg1, arg2);
|
||||||
}
|
}
|
||||||
|
|
||||||
function takeFromExternrefTable0(idx) {
|
function takeFromExternrefTable0(idx) {
|
||||||
|
@ -214,7 +228,7 @@ function __wbg_adapter_35(arg0, arg1) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function __wbg_adapter_40(arg0, arg1, arg2) {
|
function __wbg_adapter_40(arg0, arg1, arg2) {
|
||||||
wasm.closure1689_externref_shim(arg0, arg1, arg2);
|
wasm.closure1693_externref_shim(arg0, arg1, arg2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1534,6 +1548,12 @@ function __wbg_get_imports() {
|
||||||
imports.wbg.__wbg_uniform2f_8174f619e86c3ba2 = function(arg0, arg1, arg2, arg3) {
|
imports.wbg.__wbg_uniform2f_8174f619e86c3ba2 = function(arg0, arg1, arg2, arg3) {
|
||||||
arg0.uniform2f(arg1, arg2, arg3);
|
arg0.uniform2f(arg1, arg2, arg3);
|
||||||
};
|
};
|
||||||
|
imports.wbg.__wbg_uniformMatrix4fv_b684a40949b2ff0b = function(arg0, arg1, arg2, arg3, arg4) {
|
||||||
|
arg0.uniformMatrix4fv(arg1, arg2 !== 0, getArrayF32FromWasm0(arg3, arg4));
|
||||||
|
};
|
||||||
|
imports.wbg.__wbg_uniformMatrix4fv_fa5c91b7cee9bfd5 = function(arg0, arg1, arg2, arg3, arg4) {
|
||||||
|
arg0.uniformMatrix4fv(arg1, arg2 !== 0, getArrayF32FromWasm0(arg3, arg4));
|
||||||
|
};
|
||||||
imports.wbg.__wbg_url_5327bc0a41a9b085 = function(arg0, arg1) {
|
imports.wbg.__wbg_url_5327bc0a41a9b085 = function(arg0, arg1) {
|
||||||
const ret = arg1.url;
|
const ret = arg1.url;
|
||||||
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
||||||
|
@ -1613,20 +1633,20 @@ function __wbg_get_imports() {
|
||||||
const ret = false;
|
const ret = false;
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
imports.wbg.__wbindgen_closure_wrapper3632 = function(arg0, arg1, arg2) {
|
imports.wbg.__wbindgen_closure_wrapper3642 = function(arg0, arg1, arg2) {
|
||||||
const ret = makeMutClosure(arg0, arg1, 1004, __wbg_adapter_32);
|
const ret = makeMutClosure(arg0, arg1, 1008, __wbg_adapter_32);
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
imports.wbg.__wbindgen_closure_wrapper3634 = function(arg0, arg1, arg2) {
|
imports.wbg.__wbindgen_closure_wrapper3644 = function(arg0, arg1, arg2) {
|
||||||
const ret = makeMutClosure(arg0, arg1, 1004, __wbg_adapter_35);
|
const ret = makeMutClosure(arg0, arg1, 1008, __wbg_adapter_35);
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
imports.wbg.__wbindgen_closure_wrapper3636 = function(arg0, arg1, arg2) {
|
imports.wbg.__wbindgen_closure_wrapper3646 = function(arg0, arg1, arg2) {
|
||||||
const ret = makeMutClosure(arg0, arg1, 1004, __wbg_adapter_32);
|
const ret = makeMutClosure(arg0, arg1, 1008, __wbg_adapter_32);
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
imports.wbg.__wbindgen_closure_wrapper6213 = function(arg0, arg1, arg2) {
|
imports.wbg.__wbindgen_closure_wrapper6223 = function(arg0, arg1, arg2) {
|
||||||
const ret = makeMutClosure(arg0, arg1, 1690, __wbg_adapter_40);
|
const ret = makeMutClosure(arg0, arg1, 1694, __wbg_adapter_40);
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
imports.wbg.__wbindgen_debug_string = function(arg0, arg1) {
|
imports.wbg.__wbindgen_debug_string = function(arg0, arg1) {
|
||||||
|
@ -1700,6 +1720,7 @@ function __wbg_finalize_init(instance, module) {
|
||||||
wasm = instance.exports;
|
wasm = instance.exports;
|
||||||
__wbg_init.__wbindgen_wasm_module = module;
|
__wbg_init.__wbindgen_wasm_module = module;
|
||||||
cachedDataViewMemory0 = null;
|
cachedDataViewMemory0 = null;
|
||||||
|
cachedFloat32ArrayMemory0 = null;
|
||||||
cachedUint8ArrayMemory0 = null;
|
cachedUint8ArrayMemory0 = null;
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -11,7 +11,7 @@ use poll_promise::Promise;
|
||||||
use tracing::{debug, warn};
|
use tracing::{debug, warn};
|
||||||
use crate::map::osm::OSMBaselayer;
|
use crate::map::osm::OSMBaselayer;
|
||||||
use crate::map::render::{ExtraRenderOptions, MapRender};
|
use crate::map::render::{ExtraRenderOptions, MapRender};
|
||||||
use crate::map::tiles::{LayerManager, LayerSource, Tile};
|
use crate::map::tiles::{LayerId, LayerManager, LayerSource, Tile, XCoord, YCoord, ZoomLevel};
|
||||||
|
|
||||||
pub struct Map {
|
pub struct Map {
|
||||||
pub layer_manager: LayerManager,
|
pub layer_manager: LayerManager,
|
||||||
|
@ -57,8 +57,8 @@ impl Map {
|
||||||
})
|
})
|
||||||
} else { 0.0 };
|
} else { 0.0 };
|
||||||
|
|
||||||
self.lat += xy_delta.y as f64 * 0.001;
|
self.lat += xy_delta.y as f64 * 0.0005;
|
||||||
self.long += xy_delta.x as f64 * 0.001;
|
self.long -= xy_delta.x as f64 * 0.0005;
|
||||||
self.zoom += z_delta as f64 * 0.01;
|
self.zoom += z_delta as f64 * 0.01;
|
||||||
if self.zoom < 3.0 { self.zoom = 3.0 };
|
if self.zoom < 3.0 { self.zoom = 3.0 };
|
||||||
if self.zoom > 19.0 { self.zoom = 19.0 };
|
if self.zoom > 19.0 { self.zoom = 19.0 };
|
||||||
|
@ -104,24 +104,14 @@ impl Map {
|
||||||
|
|
||||||
|
|
||||||
// for each tile, determine pixel coordinates, then offset by the tile fractionals
|
// for each tile, determine pixel coordinates, then offset by the tile fractionals
|
||||||
for x in 0..tiles_x {
|
for x in 0..=tiles_x+2 {
|
||||||
let tile_x = tilex + x;
|
let tile_x = tilex + x;
|
||||||
for y in 0..tiles_y {
|
for y in 0..=tiles_y+2 {
|
||||||
let tile_y = tiley + y;
|
let tile_y = tiley + y;
|
||||||
let start_pixel_x = x as isize * 256 - x_tile_frac as isize;
|
|
||||||
let start_pixel_y = y as isize * 256 - y_tile_frac as isize;
|
|
||||||
let end_pixel_x = start_pixel_x + 256 - x_tile_frac as isize;
|
|
||||||
let end_pixel_y = start_pixel_y + 256 -y_tile_frac as isize;
|
|
||||||
|
|
||||||
let startx_zerotoone = start_pixel_x as f64 / viewport_width as f64;
|
let pixel_x = 512_f32 * x as f32 - (2.0*x_tile_frac as f32);
|
||||||
let starty_zerotoone = start_pixel_y as f64 / viewport_height as f64;
|
let pixel_y = (-512_f32 * y as f32) + (2.0*y_tile_frac as f32);
|
||||||
let endx_zerotoone = end_pixel_x as f64 / viewport_width as f64;
|
|
||||||
let endy_zerotoone = end_pixel_y as f64 / viewport_height as f64;
|
|
||||||
|
|
||||||
let startx_opengl = startx_zerotoone * 2.0 - 1.0;
|
|
||||||
let starty_opengl = starty_zerotoone * 2.0 - 1.0;
|
|
||||||
let endx_opengl = endx_zerotoone * 2.0 - 1.0;
|
|
||||||
let endy_opengl = endy_zerotoone * 2.0 - 1.0;
|
|
||||||
|
|
||||||
// download the tile
|
// download the tile
|
||||||
let tile = self.layer_manager.tiles.entry((z_clamped as usize, tile_x, tile_y, OSMBaselayer::SOURCE_ID))
|
let tile = self.layer_manager.tiles.entry((z_clamped as usize, tile_x, tile_y, OSMBaselayer::SOURCE_ID))
|
||||||
|
@ -151,14 +141,9 @@ impl Map {
|
||||||
});
|
});
|
||||||
|
|
||||||
tiles.push(TilesetTile {
|
tiles.push(TilesetTile {
|
||||||
sp_x: start_pixel_x as f32,
|
tileid: (z_clamped as usize, tile_x, tile_y, OSMBaselayer::SOURCE_ID),
|
||||||
sp_xclip: startx_opengl as f32,
|
x: pixel_x,
|
||||||
sp_y: start_pixel_y as f32,
|
y: pixel_y,
|
||||||
sp_yclip: starty_opengl as f32,
|
|
||||||
ep_x: end_pixel_x as f32,
|
|
||||||
ep_xclip: endy_opengl as f32,
|
|
||||||
ep_y: end_pixel_y as f32,
|
|
||||||
ep_yclip: endy_opengl as f32,
|
|
||||||
tile: match tile.promise.ready() {
|
tile: match tile.promise.ready() {
|
||||||
None => None,
|
None => None,
|
||||||
Some(r) => match r {
|
Some(r) => match r {
|
||||||
|
@ -184,9 +169,11 @@ impl Map {
|
||||||
let tileset = self.load_tiles(ctx, rect.width() as usize, rect.height() as usize);
|
let tileset = self.load_tiles(ctx, rect.width() as usize, rect.height() as usize);
|
||||||
let render = self.render.clone();
|
let render = self.render.clone();
|
||||||
let options = self.options;
|
let options = self.options;
|
||||||
|
let width = rect.width();
|
||||||
|
let height = rect.height();
|
||||||
let cb = egui_glow::CallbackFn::new(move |_info, painter| {
|
let cb = egui_glow::CallbackFn::new(move |_info, painter| {
|
||||||
let tileset = tileset.clone();
|
let tileset = tileset.clone();
|
||||||
render.lock().unwrap().paint(painter.gl(), tileset, options);
|
render.lock().unwrap().paint(painter.gl(), width, height, tileset, options);
|
||||||
});
|
});
|
||||||
ui.painter().add(egui::PaintCallback {
|
ui.painter().add(egui::PaintCallback {
|
||||||
rect,
|
rect,
|
||||||
|
@ -201,14 +188,9 @@ struct Tileset {
|
||||||
}
|
}
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
struct TilesetTile {
|
struct TilesetTile {
|
||||||
sp_x: f32,
|
tileid: (ZoomLevel, XCoord, YCoord, LayerId),
|
||||||
sp_xclip: f32,
|
x: f32,
|
||||||
sp_y: f32,
|
y: f32,
|
||||||
sp_yclip: f32,
|
|
||||||
ep_x: f32,
|
|
||||||
ep_xclip: f32,
|
|
||||||
ep_y: f32,
|
|
||||||
ep_yclip: f32,
|
|
||||||
tile: Option<DynamicImage>
|
tile: Option<DynamicImage>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
|
use std::collections::hash_map::Entry;
|
||||||
|
use std::collections::HashMap;
|
||||||
use std::io::Cursor;
|
use std::io::Cursor;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use glow::{Buffer, HasContext, PixelUnpackData, Program, Texture, VertexArray};
|
use glow::{Buffer, HasContext, PixelUnpackData, Program, Texture, VertexArray};
|
||||||
use image::{DynamicImage, EncodableLayout, ImageReader};
|
use image::{DynamicImage, EncodableLayout, ImageReader};
|
||||||
use tracing::{debug, error, warn};
|
use tracing::{debug, error, warn};
|
||||||
|
use crate::map::tiles::{LayerId, XCoord, YCoord, ZoomLevel};
|
||||||
use crate::map::Tileset;
|
use crate::map::Tileset;
|
||||||
|
|
||||||
pub struct MapRender {
|
pub struct MapRender {
|
||||||
|
@ -11,6 +14,7 @@ pub struct MapRender {
|
||||||
ebo: Buffer,
|
ebo: Buffer,
|
||||||
shader_program: Program,
|
shader_program: Program,
|
||||||
test_texture: Texture,
|
test_texture: Texture,
|
||||||
|
texture_cache: HashMap<(ZoomLevel, XCoord, YCoord, LayerId), Texture>
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
|
@ -98,6 +102,7 @@ impl MapRender {
|
||||||
vao,
|
vao,
|
||||||
ebo,
|
ebo,
|
||||||
test_texture,
|
test_texture,
|
||||||
|
texture_cache: HashMap::new()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -111,17 +116,15 @@ impl MapRender {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn paint(&self, gl: &glow::Context, tileset: Tileset, options: ExtraRenderOptions) {
|
pub fn paint(&mut self, gl: &glow::Context, width: f32, height: f32, tileset: Tileset, options: ExtraRenderOptions) {
|
||||||
use glow::HasContext as _;
|
use glow::HasContext as _;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let verticies: &[f32] = &[
|
let verticies: &[f32] = &[
|
||||||
// X Y Z S T
|
// X Y Z S T
|
||||||
0.5, 0.5, 0.0, 1.0, 1.0, // top right
|
1.0, 1.0, 0.0, 1.0, 1.0, // top right
|
||||||
0.5, -0.5, 0.0, 1.0, 0.0, // bottom right
|
1.0, -1.0, 0.0, 1.0, 0.0, // bottom right
|
||||||
-0.5, -0.5, 0.0, 0.0, 0.0, // bottom left
|
-1.0, -1.0, 0.0, 0.0, 0.0, // bottom left
|
||||||
-0.5, 0.5, 0.0, 0.0, 1.0, // top left
|
-1.0, 1.0, 0.0, 0.0, 1.0, // top left
|
||||||
];
|
];
|
||||||
let indicies: &[u32] = &[
|
let indicies: &[u32] = &[
|
||||||
0, 1, 3,
|
0, 1, 3,
|
||||||
|
@ -132,30 +135,89 @@ impl MapRender {
|
||||||
gl.clear_color(0.5, 0.1, 0.1, 1.0);
|
gl.clear_color(0.5, 0.1, 0.1, 1.0);
|
||||||
gl.clear(glow::COLOR_BUFFER_BIT);
|
gl.clear(glow::COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
gl.bind_vertex_array(Some(self.vao));
|
let lock = tileset.tiles.lock().unwrap();
|
||||||
|
for tile in lock.iter() {
|
||||||
|
let this_tile_img_data = &tile.tile;
|
||||||
|
let texture_cache_img_data = self.texture_cache.entry(tile.tileid);
|
||||||
|
if let Entry::Vacant(_) = texture_cache_img_data { if this_tile_img_data.is_none() { continue; } } // nothing to render yet
|
||||||
|
|
||||||
gl.bind_buffer(glow::ARRAY_BUFFER, Some(self.vbo));
|
let texture = texture_cache_img_data
|
||||||
gl.buffer_data_u8_slice(glow::ARRAY_BUFFER, bytemuck::cast_slice(verticies), glow::DYNAMIC_DRAW);
|
.or_insert_with(|| {
|
||||||
|
let img = this_tile_img_data.as_ref().unwrap();
|
||||||
|
let img_rgb8 = img.flipv().into_rgb8();
|
||||||
|
let w = img_rgb8.width();
|
||||||
|
let h = img_rgb8.height();
|
||||||
|
let raw = img_rgb8.into_raw();
|
||||||
|
let texture = gl.create_texture().unwrap();
|
||||||
|
gl.bind_texture(glow::TEXTURE_2D, Some(texture));
|
||||||
|
gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_S, glow::REPEAT as i32);
|
||||||
|
gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_T, glow::REPEAT as i32);
|
||||||
|
gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MAG_FILTER, glow::NEAREST as i32);
|
||||||
|
gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MIN_FILTER, glow::NEAREST as i32);
|
||||||
|
gl.tex_image_2d(
|
||||||
|
glow::TEXTURE_2D,
|
||||||
|
0,
|
||||||
|
glow::RGB as i32,
|
||||||
|
w as i32,
|
||||||
|
h as i32,
|
||||||
|
0,
|
||||||
|
glow::RGB,
|
||||||
|
glow::UNSIGNED_BYTE,
|
||||||
|
PixelUnpackData::Slice(Some(&raw)),
|
||||||
|
);
|
||||||
|
gl.generate_mipmap(glow::TEXTURE_2D);
|
||||||
|
texture
|
||||||
|
});
|
||||||
|
|
||||||
gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, Some(self.ebo));
|
gl.bind_vertex_array(Some(self.vao));
|
||||||
gl.buffer_data_u8_slice(glow::ELEMENT_ARRAY_BUFFER, bytemuck::cast_slice(indicies), glow::DYNAMIC_DRAW);
|
|
||||||
|
|
||||||
gl.vertex_attrib_pointer_f32(0, 3, glow::FLOAT, false, (5 * mem::size_of::<f32>()) as i32, 0);
|
gl.bind_buffer(glow::ARRAY_BUFFER, Some(self.vbo));
|
||||||
gl.vertex_attrib_pointer_f32(1, 2, glow::FLOAT, false, (5 * mem::size_of::<f32>()) as i32, 3 * mem::size_of::<f32>() as i32);
|
gl.buffer_data_u8_slice(glow::ARRAY_BUFFER, bytemuck::cast_slice(verticies), glow::DYNAMIC_DRAW);
|
||||||
|
|
||||||
gl.enable_vertex_attrib_array(0);
|
gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, Some(self.ebo));
|
||||||
gl.enable_vertex_attrib_array(1);
|
gl.buffer_data_u8_slice(glow::ELEMENT_ARRAY_BUFFER, bytemuck::cast_slice(indicies), glow::DYNAMIC_DRAW);
|
||||||
gl.use_program(Some(self.shader_program));
|
|
||||||
|
gl.vertex_attrib_pointer_f32(0, 3, glow::FLOAT, false, (5 * mem::size_of::<f32>()) as i32, 0);
|
||||||
|
gl.vertex_attrib_pointer_f32(1, 2, glow::FLOAT, false, (5 * mem::size_of::<f32>()) as i32, 3 * mem::size_of::<f32>() as i32);
|
||||||
|
|
||||||
|
gl.enable_vertex_attrib_array(0);
|
||||||
|
gl.enable_vertex_attrib_array(1);
|
||||||
|
|
||||||
|
gl.use_program(Some(self.shader_program));
|
||||||
|
|
||||||
|
debug!("{} {}", tile.x, tile.y);
|
||||||
|
|
||||||
|
let w = 256.0_f32;
|
||||||
|
let h = 256.0_f32;
|
||||||
|
let x = (tile.x + w) / width - 1.0;
|
||||||
|
let y = (tile.y - h) / width + 1.0;
|
||||||
|
|
||||||
|
let transform = nalgebra_glm::translate(&nalgebra_glm::Mat4::identity(), &nalgebra_glm::vec3(x, y, 0.0));
|
||||||
|
|
||||||
|
let width = w / width;
|
||||||
|
let height = h / height;
|
||||||
|
|
||||||
|
let transform = nalgebra_glm::scale(&transform, &nalgebra_glm::vec3(width, height, 1.0));
|
||||||
|
|
||||||
|
// screenspace-ify:
|
||||||
|
// map to 0 to 1 space
|
||||||
|
|
||||||
|
gl.uniform_matrix_4_f32_slice(
|
||||||
|
gl.get_uniform_location(self.shader_program, "transform").as_ref(),
|
||||||
|
false,
|
||||||
|
(&transform).into(),
|
||||||
|
);
|
||||||
|
|
||||||
|
gl.active_texture(glow::TEXTURE0);
|
||||||
|
|
||||||
|
gl.bind_texture(glow::TEXTURE_2D, Some(*texture));
|
||||||
|
|
||||||
|
gl.bind_vertex_array(Some(self.vao));
|
||||||
|
gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, Some(self.ebo));
|
||||||
|
|
||||||
|
|
||||||
gl.active_texture(glow::TEXTURE0);
|
gl.draw_elements(glow::TRIANGLES, 6, glow::UNSIGNED_INT, 0);
|
||||||
gl.bind_texture(glow::TEXTURE_2D, Some(self.test_texture));
|
}
|
||||||
|
|
||||||
gl.bind_vertex_array(Some(self.vao));
|
|
||||||
gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, Some(self.ebo));
|
|
||||||
|
|
||||||
|
|
||||||
gl.draw_elements(glow::TRIANGLES, 6, glow::UNSIGNED_INT, 0);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,9 @@ layout (location = 1) in vec2 aTexCoord;
|
||||||
|
|
||||||
out vec2 texCoord;
|
out vec2 texCoord;
|
||||||
|
|
||||||
|
uniform mat4 transform;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
|
gl_Position = transform * vec4(aPos, 1.0f);
|
||||||
texCoord = aTexCoord;
|
texCoord = vec2(aTexCoord.x, aTexCoord.y);
|
||||||
}
|
}
|
Loading…
Add table
Reference in a new issue