40 lines
1.1 KiB
Rust
40 lines
1.1 KiB
Rust
use super::MAP_HEIGHT;
|
|
|
|
use super::MAP_WIDTH;
|
|
|
|
use libm::Libm;
|
|
|
|
use nalgebra::Vector2;
|
|
|
|
pub(crate) fn sample_map_inter(point: Vector2<f32>, map: &[u8]) -> f32 {
|
|
let x = libm::floorf(point.x) as usize % MAP_WIDTH;
|
|
let y = libm::floorf(point.y) as usize % MAP_HEIGHT;
|
|
let p0 = Vector2::new(libm::floorf(point.x), libm::floorf(point.y));
|
|
let p1 = p0 + Vector2::new(1.0, 0.0);
|
|
let p2 = p0 + Vector2::new(0.0, 1.0);
|
|
let p3 = p0 + Vector2::new(1.0, 1.0);
|
|
|
|
let tx = point.x - libm::floorf(point.x);
|
|
let ty = point.y - libm::floorf(point.y);
|
|
|
|
let top = (1.0 - tx) * sample_map(p0, map) as f32 + tx * sample_map(p1, map) as f32;
|
|
let bot = (1.0 - tx) * sample_map(p2, map) as f32 + tx * sample_map(p3, map) as f32;
|
|
|
|
(1.0-ty) * top + ty * bot
|
|
}
|
|
|
|
pub(crate) fn sample_map(point: Vector2<f32>, map: &[u8]) -> u8 {
|
|
const MARGIN: usize = 3;
|
|
let x = libm::floorf(point.x) as usize % (MAP_WIDTH + MARGIN);
|
|
let y = libm::floorf(point.y) as usize % (MAP_HEIGHT + MARGIN);
|
|
|
|
if x >= MAP_WIDTH || y >= MAP_HEIGHT {
|
|
if x-y > 12 {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
map[y*MAP_WIDTH + x]
|
|
|
|
}
|