first two stages of write-to-file complete. waiting on plans for dependency element data (meshes)

This commit is contained in:
Lillian Vixe 2024-05-28 13:37:10 -07:00
parent f38839557b
commit 0455167d78

View file

@ -13,6 +13,7 @@ use thiserror::Error;
pub struct StructureAsset {
pub layout: StringTree,
pub default_pose_positions: HashMap<String, Transform>,
pub element_data: HashMap<String, String>,
}
#[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<Vec<u8>> {
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::<String>::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::<String>::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())
}
}