Implement world viewer with support for OBJ worlds

This commit is contained in:
2025-02-16 15:55:21 -05:00
parent f7cf960b62
commit cfc08032e6
11 changed files with 497 additions and 60 deletions
+21 -7
View File
@@ -1,6 +1,7 @@
use std::{
collections::HashMap,
fmt::Debug,
iter::FusedIterator,
sync::{atomic::AtomicU64, Arc, Mutex, RwLock, RwLockReadGuard, TryLockError, Weak},
};
@@ -117,7 +118,6 @@ impl<const N: usize, T: MemoryValue> MemoryValue for [T; N] {
pub struct MemoryIter<'a, T> {
bytes: &'a [u8],
index: usize,
_phantom: std::marker::PhantomData<T>,
}
@@ -125,7 +125,6 @@ impl<'a, T> MemoryIter<'a, T> {
fn new(bytes: &'a [u8]) -> Self {
Self {
bytes,
index: 0,
_phantom: std::marker::PhantomData,
}
}
@@ -136,15 +135,30 @@ impl<T: MemoryValue> Iterator for MemoryIter<'_, T> {
#[inline]
fn next(&mut self) -> Option<Self::Item> {
if self.index >= self.bytes.len() {
return None;
}
let bytes = &self.bytes[self.index..self.index + std::mem::size_of::<T>()];
self.index += std::mem::size_of::<T>();
let (bytes, rest) = self.bytes.split_at_checked(std::mem::size_of::<T>())?;
self.bytes = rest;
Some(T::from_bytes(bytes))
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
let size = self.bytes.len() / std::mem::size_of::<T>();
(size, Some(size))
}
}
impl<T: MemoryValue> DoubleEndedIterator for MemoryIter<'_, T> {
fn next_back(&mut self) -> Option<Self::Item> {
let mid = self.bytes.len().checked_sub(std::mem::size_of::<T>())?;
// SAFETY: the checked_sub above is effectively a bounds check
let (rest, bytes) = unsafe { self.bytes.split_at_unchecked(mid) };
self.bytes = rest;
Some(T::from_bytes(bytes))
}
}
impl<T: MemoryValue> FusedIterator for MemoryIter<'_, T> {}
impl MemoryRef<'_> {
pub fn read<T: MemoryValue>(&self, index: usize) -> T {
let from = index * size_of::<T>();