summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-03-27 14:38:31 +0100
committermetamuffin <metamuffin@disroot.org>2025-03-27 14:38:31 +0100
commit9f16507564354422b64e437e547d8403b22b70c7 (patch)
treea2d3fee9be8c626b1832df1fa4d8aa8b6c253b3d
parentd48ff95ec3739b8179b0e0f5b07d5c89f8f5b33f (diff)
downloadweareserver-9f16507564354422b64e437e547d8403b22b70c7.tar
weareserver-9f16507564354422b64e437e547d8403b22b70c7.tar.bz2
weareserver-9f16507564354422b64e437e547d8403b22b70c7.tar.zst
lay a foundation for subresource listings
-rw-r--r--shared/src/lib.rs3
-rw-r--r--shared/src/loader.rs13
-rw-r--r--shared/src/packets.rs5
-rw-r--r--shared/src/resources.rs44
4 files changed, 63 insertions, 2 deletions
diff --git a/shared/src/lib.rs b/shared/src/lib.rs
index c3d8d6b..61828fc 100644
--- a/shared/src/lib.rs
+++ b/shared/src/lib.rs
@@ -25,8 +25,9 @@
pub mod helper;
pub mod packets;
pub mod resources;
+pub mod respack;
pub mod store;
pub mod tree;
-pub mod respack;
+pub mod loader;
pub use glam::{Affine3A, Mat3A, Vec2, Vec3A, Vec4, vec2, vec3a, vec4};
diff --git a/shared/src/loader.rs b/shared/src/loader.rs
new file mode 100644
index 0000000..0172265
--- /dev/null
+++ b/shared/src/loader.rs
@@ -0,0 +1,13 @@
+use crate::{helper::ReadWrite, packets::Resource};
+use anyhow::Result;
+use std::io::Cursor;
+
+pub trait ResLoader: Send + Sync {
+ fn get_raw(&self, res: Resource) -> impl Future<Output = Result<Vec<u8>>> + Send;
+ fn get<R: ReadWrite + Sync>(
+ &self,
+ res: &Resource<R>,
+ ) -> impl Future<Output = Result<R>> + Send {
+ async { R::read(&mut Cursor::new(self.get_raw(res.to_generic()).await?)) }
+ }
+}
diff --git a/shared/src/packets.rs b/shared/src/packets.rs
index 11b5f8a..c03f5e5 100644
--- a/shared/src/packets.rs
+++ b/shared/src/packets.rs
@@ -51,6 +51,11 @@ impl<T> Ord for Resource<T> {
self.0.cmp(&other.0)
}
}
+impl<T> Resource<T> {
+ pub fn to_generic(&self) -> Resource {
+ Resource(self.0, PhantomData)
+ }
+}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct Object(pub u128);
diff --git a/shared/src/resources.rs b/shared/src/resources.rs
index 5fa810d..4d14633 100644
--- a/shared/src/resources.rs
+++ b/shared/src/resources.rs
@@ -14,7 +14,7 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-use crate::{helper::ReadWrite, packets::Resource};
+use crate::{helper::ReadWrite, loader::ResLoader, packets::Resource};
use anyhow::Result;
use glam::{Affine3A, Vec2, Vec3A, Vec4};
use log::warn;
@@ -280,3 +280,45 @@ impl ReadWrite for Image<'_> {
self.0.write_alloc()
}
}
+
+pub trait Subresources {
+ fn subresources(&self, l: &impl ResLoader) -> impl Future<Output = Result<Vec<Resource>>>;
+}
+impl Subresources for Prefab {
+ async fn subresources(&self, l: &impl ResLoader) -> Result<Vec<Resource>> {
+ let mut o = Vec::new();
+ for (_, mesh) in &self.mesh {
+ o.extend(l.get(mesh).await?.subresources(l).await?);
+ }
+ Ok(o)
+ }
+}
+impl Subresources for MeshPart {
+ async fn subresources(&self, _l: &impl ResLoader) -> Result<Vec<Resource>> {
+ Ok(None
+ .into_iter()
+ .chain(self.index.iter().map(Resource::to_generic))
+ .chain(self.va_position.iter().map(Resource::to_generic))
+ .chain(self.va_normal.iter().map(Resource::to_generic))
+ .chain(self.va_tangent.iter().map(Resource::to_generic))
+ .chain(self.va_texcoord.iter().map(Resource::to_generic))
+ .chain(self.va_roughness.iter().map(Resource::to_generic))
+ .chain(self.va_metallic.iter().map(Resource::to_generic))
+ .chain(self.va_albedo.iter().map(Resource::to_generic))
+ .chain(self.va_transmission.iter().map(Resource::to_generic))
+ .chain(self.va_alpha.iter().map(Resource::to_generic))
+ .chain(self.va_emission.iter().map(Resource::to_generic))
+ .chain(self.va_joint_index.iter().map(Resource::to_generic))
+ .chain(self.va_joint_weight.iter().map(Resource::to_generic))
+ .chain(self.tex_normal.iter().map(Resource::to_generic))
+ .chain(self.tex_roughness.iter().map(Resource::to_generic))
+ .chain(self.tex_metallic.iter().map(Resource::to_generic))
+ .chain(self.tex_albedo.iter().map(Resource::to_generic))
+ .chain(self.tex_transmission.iter().map(Resource::to_generic))
+ .chain(self.tex_alpha.iter().map(Resource::to_generic))
+ .chain(self.tex_emission.iter().map(Resource::to_generic))
+ .chain(self.tex_thickness.iter().map(Resource::to_generic))
+ .chain(self.tex_occlusion.iter().map(Resource::to_generic))
+ .collect())
+ }
+}