Fix project loading / saving

This commit is contained in:
Connor Slade
2024-09-01 19:37:24 -04:00
parent f08bcfe9f3
commit 183c57120c
8 changed files with 8 additions and 106 deletions

2
Cargo.lock generated
View File

@@ -2958,6 +2958,7 @@ dependencies = [
"num-complex 0.4.6",
"num-rational 0.4.2",
"num-traits",
"serde",
"simba",
"typenum",
]
@@ -3152,6 +3153,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
dependencies = [
"num-traits",
"serde",
]
[[package]]

View File

@@ -25,7 +25,7 @@ image = "0.25.1"
imageproc = "0.25.0"
itertools = "0.13.0"
md5 = "0.7.0"
nalgebra = "0.32.6"
nalgebra = { version = "0.32.6", features = ["serde-serialize"] }
notify-rust = "4.11.0"
obj-rs = "0.7.1"
open = "5.3.0"
@@ -43,4 +43,4 @@ stl_io = "0.7.0"
toml = "0.8.16"
tracing = "0.1.40"
tracing-subscriber = "0.3.18"
wgpu = "0.19.4"
wgpu = "0.19.4"

View File

@@ -78,3 +78,6 @@
- [ ] Undo / Redo
- [x] Close file menu if button clicked
- [ ] Allow dragging in project to load them?
- [ ] Compress meshes when stored as a project
- [ ] Remember the file that was opened for future save operations
- [ ] Save on remote thread

View File

@@ -1,13 +1,9 @@
use nalgebra::{Vector2, Vector3};
use serde::{Deserialize, Serialize};
use crate::serde_impls::vector3f;
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct SliceConfig {
#[serde(skip)]
pub platform_resolution: Vector2<u32>,
#[serde(with = "vector3f")]
pub platform_size: Vector3<f32>,
pub slice_height: f32,

View File

@@ -3,4 +3,3 @@ pub mod image;
pub mod misc;
pub mod oklab;
pub mod serde;
pub mod serde_impls;

View File

@@ -1,88 +0,0 @@
use nalgebra::Vector3;
use serde::{Deserialize, Serialize};
pub mod vector3f {
use super::*;
pub fn deserialize<'de, D>(deserializer: D) -> Result<Vector3<f32>, D::Error>
where
D: serde::Deserializer<'de>,
{
let [x, y, z] = <[f32; 3]>::deserialize(deserializer)?;
Ok(Vector3::new(x, y, z))
}
pub fn serialize<S>(data: &Vector3<f32>, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
data.as_slice().serialize(serializer)
}
}
pub mod vector2u {
use nalgebra::Vector2;
use super::*;
pub fn deserialize<'de, D>(deserializer: D) -> Result<Vector2<u32>, D::Error>
where
D: serde::Deserializer<'de>,
{
let [x, y] = <[u32; 2]>::deserialize(deserializer)?;
Ok(Vector2::new(x, y))
}
pub fn serialize<S>(data: &Vector2<u32>, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
data.as_slice().serialize(serializer)
}
}
pub mod vector3_list {
use super::*;
pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<Vector3<f32>>, D::Error>
where
D: serde::Deserializer<'de>,
{
let data = Vec::<f32>::deserialize(deserializer)?;
Ok(data
.chunks(3)
.map(|chunk| Vector3::new(chunk[0], chunk[1], chunk[2]))
.collect())
}
pub fn serialize<S>(data: &[Vector3<f32>], serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let out = data.iter().flat_map(|v| v.iter()).collect::<Vec<_>>();
out.serialize(serializer)
}
}
pub mod index_list {
use super::*;
pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<[u32; 3]>, D::Error>
where
D: serde::Deserializer<'de>,
{
let data = Vec::<u32>::deserialize(deserializer)?;
Ok(data
.chunks(3)
.map(|chunk| [chunk[0], chunk[1], chunk[2]])
.collect())
}
pub fn serialize<S>(data: &[[u32; 3]], serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let out = data.iter().flat_map(|v| v.iter()).collect::<Vec<_>>();
out.serialize(serializer)
}
}

View File

@@ -3,18 +3,14 @@ use nalgebra::Vector3;
use serde::{Deserialize, Serialize};
use crate::render::rendered_mesh::RenderedMesh;
use common::serde_impls::{index_list, vector3_list, vector3f};
use slicer::mesh::Mesh;
#[derive(Deserialize)]
pub struct OwnedProjectMesh {
info: ProjectMeshInfo,
#[serde(with = "vector3_list")]
vertices: Vec<Vector3<f32>>,
#[serde(with = "index_list")]
faces: Vec<[u32; 3]>,
#[serde(with = "vector3_list")]
normals: Vec<Vector3<f32>>,
}
@@ -22,11 +18,8 @@ pub struct OwnedProjectMesh {
pub struct BorrowedProjectMesh<'a> {
info: ProjectMeshInfo,
#[serde(with = "vector3_list")]
vertices: &'a [Vector3<f32>],
#[serde(with = "index_list")]
faces: &'a [[u32; 3]],
#[serde(with = "vector3_list")]
normals: &'a [Vector3<f32>],
}
@@ -37,11 +30,8 @@ pub struct ProjectMeshInfo {
color: Color32,
hidden: bool,
#[serde(with = "vector3f")]
position: Vector3<f32>,
#[serde(with = "vector3f")]
scale: Vector3<f32>,
#[serde(with = "vector3f")]
rotation: Vector3<f32>,
}

View File

@@ -53,7 +53,7 @@ impl OwnedProject {
anyhow::bail!("Invalid version: Expected {VERSION} found {version}");
}
Ok(bincode::deserialize_from(reader).unwrap())
Ok(bincode::deserialize_from(reader)?)
}
pub fn apply(self, app: &mut App) {