Fix project loading / saving
This commit is contained in:
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -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]]
|
||||
|
@@ -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"
|
||||
|
3
TODO.md
3
TODO.md
@@ -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
|
||||
|
@@ -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,
|
||||
|
||||
|
@@ -3,4 +3,3 @@ pub mod image;
|
||||
pub mod misc;
|
||||
pub mod oklab;
|
||||
pub mod serde;
|
||||
pub mod serde_impls;
|
||||
|
@@ -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)
|
||||
}
|
||||
}
|
@@ -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>,
|
||||
}
|
||||
|
||||
|
@@ -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) {
|
||||
|
Reference in New Issue
Block a user