From 0455167d78c824ef289001d407efae7bcf770d3b Mon Sep 17 00:00:00 2001 From: Lillian Vixe Date: Tue, 28 May 2024 13:37:10 -0700 Subject: [PATCH] first two stages of write-to-file complete. waiting on plans for dependency element data (meshes) --- src/vvlib/s_structure_asset.rs | 109 +++++++++++++++++++++------------ 1 file changed, 71 insertions(+), 38 deletions(-) diff --git a/src/vvlib/s_structure_asset.rs b/src/vvlib/s_structure_asset.rs index 6f6560f..b3e28a1 100644 --- a/src/vvlib/s_structure_asset.rs +++ b/src/vvlib/s_structure_asset.rs @@ -13,6 +13,7 @@ use thiserror::Error; pub struct StructureAsset { pub layout: StringTree, pub default_pose_positions: HashMap, + pub element_data: HashMap, } #[derive(Default)] @@ -94,6 +95,8 @@ pub mod serialization { pub mod version_1 { + use bevy::transform::components::Transform; + use crate::vvedit::s_string_tree::StringTree; use super::super::super::super::{StructureAsset, StructureLoadError}; @@ -103,6 +106,7 @@ pub mod serialization { Err(StructureLoadError::FileDataInvalid("".to_string())) } pub fn save(asset: &StructureAsset) -> Option> { + const NEWLINE: &str = "\n"; // FILE STRUCTURE: // FIRST, STRING TREE // STRING TREE IS STORED AS LISTS OF STRINGS - FIRST STRING IS PARENT @@ -112,52 +116,81 @@ pub mod serialization { // LIST OF NODE IDS BY STRING NAME, FOLLOWED BY TRANSFORM DATA, FOLLOWED BY NONSTANDARD DATA (MESH BEING RENDERED AT THIS TRANSFORM) let mut data: String = "".into(); - let mut is_first = true; - data += "\n"; - let mut to_process = Vec::::new(); - for each in &asset.layout.root { - if let Some(name) = each.name_of() { - // - if !is_first { - data += "|"; + // v STRING TREE (tree that defines shape/structure of it) + { + let mut is_first = true; + data += NEWLINE; + let mut to_process = Vec::::new(); + for each in &asset.layout.root { + if let Some(name) = each.name_of() { + // + if !is_first { + data += "|"; + } else { + is_first = false; + } + data += name.clone().as_str(); } else { - is_first = false; + return None; } - data += name.clone().as_str(); - } else { - return None; - } - if let Some(children) = each.children() { - for each in children { - to_process.push(each); - } - } - } - // v HELPER FUNCTION - fn save_child(element: &String, tree: &StringTree, data: &mut String) { - if let Some(children) = tree.children_of(element) { - if children.is_empty() { - return; - } - *data += "\n"; - *data += element.as_str(); - for each in children { - *data += "|"; - *data += each.as_str(); - } - } - } - // ^ HELPER FUNCTION - while !to_process.is_empty() { - if let Some(next) = to_process.pop() { - save_child(&next, &asset.layout, &mut data); - if let Some(children) = asset.layout.children_of(&next) { + if let Some(children) = each.children() { for each in children { to_process.push(each); } } } + // v HELPER FUNCTION + fn save_child(element: &String, tree: &StringTree, data: &mut String) { + if let Some(children) = tree.children_of(element) { + if children.is_empty() { + return; + } + *data += NEWLINE; + *data += element.as_str(); + for each in children { + *data += "|"; + *data += each.as_str(); + } + } + } + // ^ HELPER FUNCTION + while !to_process.is_empty() { + if let Some(next) = to_process.pop() { + save_child(&next, &asset.layout, &mut data); + if let Some(children) = asset.layout.children_of(&next) { + for each in children { + to_process.push(each); + } + } + } + } } + // ^ STRING TREE (tree that defines shape/structure of it) + data += NEWLINE; + data += "||"; + // v NODE IDS BY STRING NAME, FOLLOWED BY TRANSFORM DATA, FOLLOWED BY NONSTANDARD DATA + { + // error if bool is true + fn transform_to_file(pos: &Transform, data: &mut String) -> bool { + let [x, y, z] = pos.translation.to_array(); + *data += format!("{x}|{y}|{z}").as_str(); + let [x, y, z] = pos.scale.to_array(); + *data += format!("|{x}|{y}|{z}").as_str(); + let [x, y, z, w] = pos.rotation.to_array(); + *data += format!("|{x}|{y}|{z}|{w}").as_str(); + true + } + for (name, pos) in &asset.default_pose_positions { + data += NEWLINE; + data += format!("{name}|").as_str(); + if !transform_to_file(pos, &mut data) { + return None; + } + } + } + // ^ NODE IDS BY STRING NAME, FOLLOWED BY TRANSFORM DATA, FOLLOWED BY NONSTANDARD DATA + data += NEWLINE; + data += "||"; Some(data.as_bytes().to_vec()) } }