mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Massively sped up VolMap offset calculations
Former-commit-id: 8f3cdf57a77691ca60c0921bc86a79c8cfe36539
This commit is contained in:
parent
216819ca92
commit
edfd2290eb
@ -110,7 +110,7 @@ impl State {
|
|||||||
ecs.add_resource(TimeOfDay(0.0));
|
ecs.add_resource(TimeOfDay(0.0));
|
||||||
ecs.add_resource(Time(0.0));
|
ecs.add_resource(Time(0.0));
|
||||||
ecs.add_resource(DeltaTime(0.0));
|
ecs.add_resource(DeltaTime(0.0));
|
||||||
ecs.add_resource(TerrainMap::new());
|
ecs.add_resource(TerrainMap::new().unwrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Register a component with the state's ECS
|
/// Register a component with the state's ECS
|
||||||
|
@ -19,6 +19,7 @@ pub enum VolMapErr {
|
|||||||
NoSuchChunk,
|
NoSuchChunk,
|
||||||
ChunkErr(ChunkErr),
|
ChunkErr(ChunkErr),
|
||||||
DynaErr(DynaErr),
|
DynaErr(DynaErr),
|
||||||
|
InvalidChunkSize,
|
||||||
}
|
}
|
||||||
|
|
||||||
// V = Voxel
|
// V = Voxel
|
||||||
@ -31,13 +32,20 @@ pub struct VolMap<V: Vox + Clone, S: VolSize + Clone, M: Clone> {
|
|||||||
|
|
||||||
impl<V: Vox + Clone, S: VolSize + Clone, M: Clone> VolMap<V, S, M> {
|
impl<V: Vox + Clone, S: VolSize + Clone, M: Clone> VolMap<V, S, M> {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn chunk_key(pos: Vec3<i32>) -> Vec3<i32> {
|
pub fn chunk_key(pos: Vec3<i32>) -> Vec3<i32> {
|
||||||
pos.map2(S::SIZE, |e, sz| e.div_euclid(sz as i32))
|
pos.map2(S::SIZE, |e, sz| {
|
||||||
|
// Horrid, but it's faster than a cheetah with a red bull blood transfusion
|
||||||
|
let log2 = (sz - 1).count_ones();
|
||||||
|
((((e as i64 + (1 << 32)) as u64) >> log2) - (1 << (32 - log2))) as i32
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn chunk_offs(pos: Vec3<i32>) -> Vec3<i32> {
|
pub fn chunk_offs(pos: Vec3<i32>) -> Vec3<i32> {
|
||||||
pos.map2(S::SIZE, |e, sz| e.rem_euclid(sz as i32))
|
pos.map2(S::SIZE, |e, sz| {
|
||||||
|
// Horrid, but it's even faster than the aforementioned cheetah
|
||||||
|
(((e as i64 + (1 << 32)) as u64) & (sz - 1) as u64) as i32
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -150,10 +158,17 @@ impl<V: Vox + Clone, S: VolSize + Clone, M: Clone> WriteVol for VolMap<V, S, M>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<V: Vox + Clone, S: VolSize + Clone, M: Clone> VolMap<V, S, M> {
|
impl<V: Vox + Clone, S: VolSize + Clone, M + Clone> VolMap<V, S, M> {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Result<Self, VolMapErr> {
|
||||||
Self {
|
if Self::chunk_size()
|
||||||
chunks: HashMap::new(),
|
.map(|e| e.is_power_of_two() && e > 0)
|
||||||
|
.reduce_and()
|
||||||
|
{
|
||||||
|
Ok(Self {
|
||||||
|
chunks: HashMap::new(),
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
Err(VolMapErr::InvalidChunkSize)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user